in spring-cloud-alibaba-starters/spring-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/annotation/NacosAnnotationProcessor.java [301:405]
private void handleMethodNacosConfigListener(NacosConfigListener annotation, String beanName, Object bean, Method method) {
String dataId = annotation.dataId();
String group = annotation.group();
String key = annotation.key();
try {
Type[] parameterTypes = method.getGenericParameterTypes();
if (parameterTypes.length != 1) {
throw new RuntimeException(
"@NacosConfigListener must be over a method with a single parameter");
}
String configInfo = getGroupKeyContent(dataId, group);
String refreshTargetKey = beanName + "#method#" + methodSignature(method);
TargetRefreshable currentTarget = targetListenerMap.get(refreshTargetKey);
if (currentTarget != null) {
log.info("[Nacos Config] reset {} listener from {} to {} ", refreshTargetKey,
currentTarget.getTarget(), bean);
targetListenerMap.get(refreshTargetKey).setTarget(bean);
return;
}
log.info("[Nacos Config] register {} listener on {} ", refreshTargetKey,
bean);
TargetRefreshable listener = null;
if (org.springframework.util.StringUtils.hasText(key)) {
listener = new NacosPropertiesKeyListener(bean, wrapArrayToSet(key)) {
@Override
public void configChanged(ConfigChangeEvent event) {
try {
ConfigChangeItem changeItem = event.getChangeItem(key);
String newConfig = changeItem == null ? null : changeItem.getNewValue();
if (org.springframework.util.StringUtils.hasText(newConfig)) {
if (invokePrimitiveMethod(method, getTarget(), newConfig)) {
return;
}
Object targetObject = convertContentToTargetType(newConfig, parameterTypes[0]);
ReflectionUtils.invokeMethod(method, getTarget(), targetObject);
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public String toString() {
return String.format("[spring cloud alibaba nacos config key listener , key %s , target %s ] ", key, bean + "#" + methodSignature(method));
}
};
((AbstractConfigChangeListener) listener).fillContext(dataId, group);
if (!annotation.initNotify()) {
((AbstractConfigChangeListener) listener).setLastContent(configInfo);
}
}
else {
listener = new NacosConfigRefreshableListener(bean) {
@Override
public void receiveConfigInfo(String configInfo) {
if (org.springframework.util.StringUtils.hasText(configInfo)) {
try {
if (invokePrimitiveMethod(method, getTarget(), configInfo)) {
return;
}
Object targetObject = convertContentToTargetType(configInfo, parameterTypes[0]);
ReflectionUtils.invokeMethod(method, getTarget(), targetObject);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
}
@Override
public String toString() {
return String.format("[spring cloud alibaba nacos config listener , target %s ] ", bean + "#" + methodSignature(method));
}
};
}
getNacosConfigManager().getConfigService().addListener(dataId, group, listener);
targetListenerMap.put(refreshTargetKey, listener);
if (annotation.initNotify() && org.springframework.util.StringUtils.hasText(configInfo)) {
try {
log.info("[Nacos Config] init notify listener of {} on {} start...", refreshTargetKey,
bean);
listener.receiveConfigInfo(configInfo);
log.info("[Nacos Config] init notify listener of {} on {} finished ", refreshTargetKey,
bean);
}
catch (Throwable throwable) {
log.warn("[Nacos Config] init notify listener error", throwable);
throw throwable;
}
}
}
catch (Throwable e) {
throw new RuntimeException(e);
}
}