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 匹配类型。