JMSContext
有两种方便的方法:
@Inject
JMSContext jmsContext;
this.jmsContext.start();
this.jmsContext.stop();
但是,我不允许使用这些方法,因为
start()
的JavaDoc声明“如果JMSContext是容器管理的(注入),则不得使用此方法。这样做将引发IllegalStateRuntimeException。”(我尝试过,这两种方法均不引发异常。)
那么,如果
JMSContext
是容器管理的,如何启动和停止它呢? 最佳答案
容器管理的start()
的生命周期(stop()
,JMSContext
)由容器管理。这意味着注入的JMSContext
在注入时已经开始,并且将根据使用JMSContext
的上下文由容器停止。
这是JMS Specification 2.0(Download)关于此主题必须说的:
12.4.4。注入的JMSContext对象的范围
如果在JTA事务(Bean管理的和容器管理的)中使用了注入的JMSContext,则其范围将是事务的范围。这意味着:
第一次在事务中使用JMSContext对象时,将自动创建该对象。
提交事务后,JMSContext对象将自动关闭。
如果在同一个JTA事务中,不同的bean或同一bean中的不同方法,使用注入的JMSContext(通过相同的注释注入),则它们将共享相同的JMSContext对象。
如果在没有JTA事务时使用注入的JMSContext,则其范围将是现有CDI范围@RequestScoped。这意味着:
JMSContext对象将在第一次在请求中使用时创建。
请求结束时,JMSContext对象将关闭。
如果在同一个请求中,不同的bean或同一bean中的不同方法,使用注入的JMSContext(通过相同的注释注入),则它们将共享相同的JMSContext对象。
如果在JTA事务中和JTA事务之外都使用了注入的JMSContext,则将使用单独的JMSContext对象,并且如上所述,每个JTA事务都使用单独的JMSContext对象。
它进一步描述了对JMSContext
API的限制:
12.4.5。使用注入的JMSContext对象的限制
但是,为了避免一个bean中的代码出现意外情况的可能性
对不同bean的影响,以下更改公共方法
如果注入了JMSContext,则将不允许JMSContext的状态。
setClientID
setExceptionListener
停
确认
承诺
回滚
恢复
setAutoStart
开始
关
[...]
当应用程序管理JMSContext时,这些限制不适用。