我有一个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个容器中被成功地初始化。内存不是发布的,因为我使用的系统有125 at的ram,而在此问题发生时,内存是90 at的空闲内存。
这是使用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应用程序,它运行着30个没有这个问题的码头容器,因此我不敢相信:D。
发布于 2022-05-19 11:35:36
我认为你应该这样做:
@Configuration
public class ConfigStatus {
@Bean
Status currentStatus(@Value("${olt.id}") int olt_id) {
return new Status(olt_id);
}
}如果Spring按照实例化顺序优先于@Value而不是@Bean,那么我并不百分之百地相信,这样做可以保证排序。可能是您的一些实例试图在值出现之前加载bean,因此退出了一些NPE。
另外,您应该可以删除行:@DependsOn("createStatus") in ReceiveMessageHandler.java。Spring在@Configuration类之前运行@Service类,@Autowired与类型匹配。
https://stackoverflow.com/questions/72303056
复制相似问题