Bean以不确定的方式初始化失败



我有一个Spring Boot应用程序,它有以下bean:

@Configuration
public class ConfigStatus {
@Value("${olt.id}")
private int olt_id;
@Bean
Status createStatus() {
return new Status(olt_id);
}
}

我用这个应用程序启动了几个容器(确切地说是20个),在其中一些容器中,bean无法初始化,我不明白为什么。在20个容器中的18个中成功地一致初始化了bean。内存不是一个问题,因为我使用的系统有125gb的ram,在这个问题发生的时候,它有90gb的空闲内存。

这是使用bean的类:

@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 Boot应用程序,其中有30个正在运行的docker容器,其中没有发生此问题,因此我不相信:d

我认为你应该这样做:

@Configuration
public class ConfigStatus {
@Bean
Status currentStatus(@Value("${olt.id}") int olt_id) {
return new Status(olt_id);
}
}

我不能100%确定Spring在其实例化顺序中是否优先考虑@Value而不是@Bean,所以这样做可以保证顺序。可能是一些实例试图在值存在之前加载bean,因此在一些NPE上退出。

此外,您应该能够删除行:@DependsOn("createStatus")ReceiveMessageHandler.java。Spring在@Service类之前运行@Configuration类,并且@Autowired匹配类型。

相关内容

  • 没有找到相关文章

最新更新