Hey*_*nge 1 java cdi hazelcast jakarta-ee
说在下面的代码中,Hazelcast 实例将是应用程序范围是真的吗?
@ApplicationScoped
public class Producer {
private HazelcastInstance instance;
@PostConstruct
public void afterCreate() {
instance = Hazelcast.newHazelcastInstance();
}
@Produces
public HazelcastInstance getInstance() {
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
这个解决方案:
@ApplicationScoped
public class Producer {
private HazelcastInstance instance;
private Producer() {}
@PostConstruct
public void afterCreate() {
instance = Hazelcast.newHazelcastInstance();
}
@PreDestroy
public void beforeDestroy() {
if(instance != null) {
instance.shutdown();
}
}
@Produces
@ApplicationScoped
public HazelcastInstance getInstance() {
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
您的Producerbean 将是应用程序范围的,这一点很清楚。但是,HazelnutInstancebean 将是@Dependent.
因此,如果您在代码中的某处执行@Inject HazelnutInstance此操作,则会从 CDI 的角度注入一个依赖实例。
但是你总是返回同一个实例,永远不会在你的生产者中创建新对象,所以理论上,你正在共享一个实例。
但是,请注意 bean 生命周期!@Dependent当注入它们的 bean 被销毁时,bean 将被销毁。所以现在假设涉及到这种破坏尝试 - Weld 将尝试破坏您的依赖 bean 并将调用@PreDestroy(在“经典”bean 上)或@Disposes(在带有生产者的 bean 上)方法。
因此,在您的情况下,如果某处有处理的disposer 方法,则HazelcastInstance可能会导致麻烦,因为每次 Weld 尝试销毁/处理该依赖 bean 时都会调用它。
IMO 如果您将HazelcastInstance应用程序限定为范围,您会更好。例如
@Produces
@ApplicationScoped
public HazelcastInstance getInstance() {
return instance;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2558 次 |
| 最近记录: |