如果您遵循Java EE,您将不会知道JMS 2.0(Java EE 7)中的简化API组件。 构成简化API一部分的重要接口之一是javax.jms.JMSContext接口。
根据实例的获取和管理方式(生命周期),JMSContext可以分为两种类型:容器管理和应用程序管理
应用管理
让我们看一下代码片段:
@Path("email")
@Stateless
public class EmailService {//pulls in default Conn Factory as per Java EE 7@ResourceConnectionFactory cf;//application managedJMSContext ctx;@Resource("jms/emailQ")Destination emailQ;@POSTpublic void send(String email) {Session session;try {ctx = cf.createContext();ctx.createProducer().send(emailQ, email);System.out.println("Message Sent to queue - " + ((Queue) emailQ).getQueueName());} catch (JMSException ex) {Logger.getLogger(EmailService.class.getName()).log(Level.SEVERE, null, ex);throw new JMSRuntimeException(ex.getMessage(), ex.getMessage(), ex);} finally {//clean up after use. Can also be done as inside a @PreDestroy callback methodctx.close();System.out.println("JMSContext closed");}}
}
在这种情况下,使用ConnectionFactory获得了JMSContext的实例,因此需要由应用程序代码关闭。 容器将无法管理其生命周期
集装箱管理
如果使用@Inject允许容器注入JMSContext实例,则容器将对其生命周期承担全部责任。
@Path("email")
@Stateless
public class AwesomeEmailService {//container managed@InjectJMSContext ctx;@Resource("jms/emailQ")Destination emailQ;@POSTpublic void send(String email) {Session session;try {ctx.createProducer().send(emailQ, email);System.out.println("Message Sent to queue - " + ((Queue) emailQ).getQueueName());} catch (JMSException ex) {Logger.getLogger(AwesomeEmailService.class.getName()).log(Level.SEVERE, null, ex);throw new JMSRuntimeException(ex.getMessage(), ex.getMessage(), ex);}}
}
如果在容器管理的JMSContext上调用close() ,将最终遇到此异常– javax.jms.IllegalStateRuntimeException:在容器管理(注入)的JMSContext上不允许使用此方法。
和…。
在上一个示例中,容器自动使用默认的Connection Factory(根据Java EE 7)。 您还可以利用@JMSConnectionFactory批注(JMS 2.0的另一个有用补充)来指定您选择的连接工厂。
@Path("email")
@Stateless
public class TheBestEmailService {//container managed@Inject@JMSConnectionFactory("jms/myConnectionFactory")JMSContext ctx;@Resource("jms/emailQ")Destination emailQ;@POSTpublic void send(String email) {Session session;try {ctx.createProducer().send(emailQ, email);System.out.println("Message Sent to queue - " + ((Queue) emailQ).getQueueName());} catch (JMSException ex) {Logger.getLogger(TheBestEmailService.class.getName()).log(Level.SEVERE, null, ex);throw new JMSRuntimeException(ex.getMessage(), ex.getMessage(), ex);}}
}
就是这样..干杯!
翻译自: https://www.javacodegeeks.com/2015/06/types-of-jmscontext-in-jms-2-0.html