首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bean失败以不确定的方式初始化

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

Stack Overflow用户
提问于 2022-05-19 10:37:53
回答 1查看 48关注 0票数 0

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

代码语言:javascript
复制
@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的类:

代码语言:javascript
复制
@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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-19 11:35:36

我认为你应该这样做:

代码语言:javascript
复制
@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与类型匹配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72303056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档