我有一個具有以下 bean 的 Spring Boot 應用程式:
@Configuration
public class ConfigStatus {
@Value("${olt.id}")
private int olt_id;
@Bean
Status createStatus() {
return new Status(olt_id);
}
}
我用這個應用程式啟動了幾個容器(準確地說是 20 個),其中一些容器無法初始化,我不明白為什么。bean 在 20 個容器中的 18 個中成功初始化。記憶體不是發行的,因為我使用的系統有 125gb 的記憶體,而在這個問題發生時有 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。
uj5u.com熱心網友回復:
所以我的假設(因為沒有提供堆疊跟蹤)是你應該這樣做:
@Configuration
public class ConfigStatus {
@Bean
Status currentStatus(@Value("${olt.id}") int olt_id) {
return new Status(olt_id);
}
}
@Value如果 Spring 在其實體化順序中優先考慮,我不是 100% 有信心@Bean,所以這樣做可以保證順序。可能是您的某些實體在值存在之前嘗試加載 bean,因此在某些 NPE 上退出。
此外,您應該能夠洗掉該行:@DependsOn("createStatus")in ReceiveMessageHandler.java。Spring 在@Configuration類之前運行@Service類,并@Autowired匹配型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479462.html
