有 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
}
}
CDI 不提供开箱即用的方式来“热切”初始化 beans。
@Startup
注释 (quarkus.io
) 来实现我们想要的。
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
)。