JMSContext有两种方便的方法:

@Inject
JMSContext jmsContext;

this.jmsContext.start();
this.jmsContext.stop();


但是,我不允许使用这些方法,因为start()的JavaDoc声明“如果JMSContext是容器管理的(注入),则不得使用此方法。这样做将引发IllegalStateRuntimeException。”

(我尝试过,这两种方法均不引发异常。)

那么,如果JMSContext是容器管理的,如何启动和停止它呢?

最佳答案

容器管理的start()的生命周期(stop()JMSContext)由容器管理。这意味着注入的JMSContext在注入时已经开始,并且将根据使用JMSContext的上下文由容器停止。

这是JMS Specification 2.0Download)关于此主题必须说的:


  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时,这些限制不适用。

07-24 21:40