[fix] fix the NPE of OmsCenterAlarmService

This commit is contained in:
tjq 2020-05-18 12:34:31 +08:00
parent a2336354d9
commit 150b1fd919

View File

@ -12,6 +12,7 @@ import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
/** /**
* 报警服务 * 报警服务
@ -21,13 +22,14 @@ import java.util.List;
*/ */
@Slf4j @Slf4j
@Service("omsCenterAlarmService") @Service("omsCenterAlarmService")
public class OmsCenterAlarmService implements Alarmable, InitializingBean { public class OmsCenterAlarmService implements Alarmable {
@Setter @Setter
@Value("${oms.alarm.bean.names}") @Value("${oms.alarm.bean.names}")
private String beanNames; private String beanNames;
private List<Alarmable> alarmableList; private List<Alarmable> alarmableList;
private volatile boolean initialized = false;
public OmsCenterAlarmService() { public OmsCenterAlarmService() {
} }
@ -35,6 +37,7 @@ public class OmsCenterAlarmService implements Alarmable, InitializingBean {
@Async("omsCommonPool") @Async("omsCommonPool")
@Override @Override
public void alarm(AlarmContent alarmContent, List<UserInfoDO> targetUserList) { public void alarm(AlarmContent alarmContent, List<UserInfoDO> targetUserList) {
init();
alarmableList.forEach(alarmable -> { alarmableList.forEach(alarmable -> {
try { try {
alarmable.alarm(alarmContent, targetUserList); alarmable.alarm(alarmContent, targetUserList);
@ -44,9 +47,20 @@ public class OmsCenterAlarmService implements Alarmable, InitializingBean {
}); });
} }
/**
* 初始化
* 使用 InitializingBean 进行初始化会导致 NPE因为没办法控制Bean开发者自己实现的Bean的加载顺序
*/
private void init() {
if (initialized) {
return;
}
synchronized (this) {
if (initialized) {
return;
}
@Override
public void afterPropertiesSet() throws Exception {
alarmableList = Lists.newLinkedList(); alarmableList = Lists.newLinkedList();
Splitter.on(",").split(beanNames).forEach(beanName -> { Splitter.on(",").split(beanNames).forEach(beanName -> {
try { try {
@ -57,5 +71,8 @@ public class OmsCenterAlarmService implements Alarmable, InitializingBean {
log.warn("[OmsCenterAlarmService] initialize Alarmable for bean: {} failed.", beanName, e); log.warn("[OmsCenterAlarmService] initialize Alarmable for bean: {} failed.", beanName, e);
} }
}); });
initialized = true;
}
} }
} }