如何在 Quarkus 应用程序中急切地初始化 CDI bean

问题描述 投票:0回答:1

有 quarkus 1.2.1 + jakarta cdi 2.0.2 的项目。 我添加了 SQS 消息的侦听器。 问题是默认情况下所有 bean 都是延迟创建的,这显然不适合侦听器。如何使这个特定的bean在应用程序启动时被初始化? 不幸的是,这个雅加达版本中没有@StartUp。有什么办法可以做到吗?

        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-universe-bom</artifactId>
            <version>1.2.1.Final</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import java.util.Map;

@ApplicationScoped
@Named("customListener")
public class CustomListener implements MessageListener {
    private static final Logger LOGGER = LoggerFactory.getLogger(CustomListener.class);
    private final CustomService customService;

    @Inject
    public CustomListener(
            @Named("customService") CustomService  customService) {
        this.customService = customService;
    }

    @Override
    public void onMessage(Message message) {
        final SQSTextMessage sqsMessage = (SQSTextMessage) message;
        //bla bla bla
    }
}
quarkus cdi eager-loading
1个回答
2
投票

CDI 不提供开箱即用的方式来“热切”初始化 beans。

Quarkus 作为专门的

@Startup
注释 (
quarkus.io
)
来实现我们想要的。

在 CDI 4.0 中,引入了

Startup
事件 (
jakarta.ee
)
。有了这个,我们可以通过观察 bean 内的事件来强制创建 bean:

@ApplicationScoped
@Named("customListener")
public class CustomListener ... {
    ...
    public void eagerInit(@Observes Startup unused) {
    }
    ...
}

感谢 Ladislav Thon,他在 zulip 中提供了 CDI 4.0 的代码示例 (

quarkusio.zulipchat.com
)

© www.soinside.com 2019 - 2024. All rights reserved.