Bean 无法以不确定的方式初始化
Bean failiing to initialize in a not deterministic way
我有一个 Spring 具有以下 bean 的引导应用程序:
@Configuration
public class ConfigStatus {
@Value("${olt.id}")
private int olt_id;
@Bean
Status createStatus() {
return new Status(olt_id);
}
}
我用这个应用程序启动了几个容器(确切地说是 20 个),其中一些容器的 bean 无法初始化,我不明白为什么。该 bean 在 20 个容器中的 18 个中被成功初始化。内存不是问题,因为我使用的系统有 125gb 的 ram,而在这个问题发生时有 90gb 的可用内存。
这是使用 bean 的 class:
@DependsOn("createStatus")
@Service
public class ReceiveMessageHandler {
Logger log = LoggerFactory.getLogger(this.getClass().getName());
private static final Gson converter = new Gson();
@Autowired private Status currentStatus;
public void handleMessage(String body) {
OltRequest request = converter.fromJson(body, OltRequest.class);
request.setStartedBeingProcessedAtOlt(new Date().getTime());
Response r = new Response(request.getId(), 200, new Date().getTime());
r.setRequestEnqueuedAtOlt(currentStatus.getEnqueuedAtWorkerTimes().get(request.getId())); // line that fails due to the bean being equal to null
r.setRequestDequeuedAtOlt(new Date().getTime());
log.info("Processing request: " + request.getId());
try {
Thread.sleep(request.getDuration());
} catch(InterruptedException e) {
e.printStackTrace();
}
request.setEndedBeingProcessedAtOlt(new Date().getTime());
log.info("Finished processing request: " + request.getId());
r.setEndedHandling(new Date().getTime());
Worker.send_response(r, request.getOriginMessage().getWorker());
}
}
错误消息说当访问 bean 时它是空的。
在我的环境中,我有另一个 Spring 带有 30 个 运行 docker 容器的启动应用程序,在其中没有发生此问题,因此我不相信 :D.
我相信你应该这样做:
@Configuration
public class ConfigStatus {
@Bean
Status currentStatus(@Value("${olt.id}") int olt_id) {
return new Status(olt_id);
}
}
如果 Spring 在其实例化顺序中将 @Value
优先于 @Bean
,我不是 100% 有信心,所以这样做可以保证顺序。可能是您的某些实例试图在该值存在之前加载 bean,因此在某些 NPE 上会出现问题。
此外,您应该能够删除行:@DependsOn("createStatus")
in ReceiveMessageHandler.java
。 Spring 在 @Service
类 之前运行 @Configuration
类,@Autowired
匹配类型。
我有一个 Spring 具有以下 bean 的引导应用程序:
@Configuration
public class ConfigStatus {
@Value("${olt.id}")
private int olt_id;
@Bean
Status createStatus() {
return new Status(olt_id);
}
}
我用这个应用程序启动了几个容器(确切地说是 20 个),其中一些容器的 bean 无法初始化,我不明白为什么。该 bean 在 20 个容器中的 18 个中被成功初始化。内存不是问题,因为我使用的系统有 125gb 的 ram,而在这个问题发生时有 90gb 的可用内存。
这是使用 bean 的 class:
@DependsOn("createStatus")
@Service
public class ReceiveMessageHandler {
Logger log = LoggerFactory.getLogger(this.getClass().getName());
private static final Gson converter = new Gson();
@Autowired private Status currentStatus;
public void handleMessage(String body) {
OltRequest request = converter.fromJson(body, OltRequest.class);
request.setStartedBeingProcessedAtOlt(new Date().getTime());
Response r = new Response(request.getId(), 200, new Date().getTime());
r.setRequestEnqueuedAtOlt(currentStatus.getEnqueuedAtWorkerTimes().get(request.getId())); // line that fails due to the bean being equal to null
r.setRequestDequeuedAtOlt(new Date().getTime());
log.info("Processing request: " + request.getId());
try {
Thread.sleep(request.getDuration());
} catch(InterruptedException e) {
e.printStackTrace();
}
request.setEndedBeingProcessedAtOlt(new Date().getTime());
log.info("Finished processing request: " + request.getId());
r.setEndedHandling(new Date().getTime());
Worker.send_response(r, request.getOriginMessage().getWorker());
}
}
错误消息说当访问 bean 时它是空的。
在我的环境中,我有另一个 Spring 带有 30 个 运行 docker 容器的启动应用程序,在其中没有发生此问题,因此我不相信 :D.
我相信你应该这样做:
@Configuration
public class ConfigStatus {
@Bean
Status currentStatus(@Value("${olt.id}") int olt_id) {
return new Status(olt_id);
}
}
如果 Spring 在其实例化顺序中将 @Value
优先于 @Bean
,我不是 100% 有信心,所以这样做可以保证顺序。可能是您的某些实例试图在该值存在之前加载 bean,因此在某些 NPE 上会出现问题。
此外,您应该能够删除行:@DependsOn("createStatus")
in ReceiveMessageHandler.java
。 Spring 在 @Service
类 之前运行 @Configuration
类,@Autowired
匹配类型。