这篇文章列出了JMS 2.0 ( Java EE 7平台的一部分)引入的所有新API(接口/类/注释等)。 这些分类如下
- API简化
- 使用方便
- 异常处理
- 杂
这是一个简短的摘要以及一些代码片段
API简化
JMSContext
在Connection和Session对象之上的更简单的抽象,从而消除了与这些类/接口进行交互以便发送/接收消息的需要。
@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");}}
}
JMSConnectionFactory
在JMSContext注入期间用于指定JMS ConnectionFactory的JNDI名称
@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);}}
}
JMSProducer和JMSConsumer
顾名思义,JMSProducer和JMSConsumer封装了分别向目的地(主题和队列)和从目的地发送JMS消息的过程。 可以从JMSContext对象获得这些对象的实例,从API易用性的角度来看,它们很重要。 这是一个“流利的” API示例
context.createProducer().send(queue,message);
context.createConsumer(topic).receiveBody(Mail.class);
XAJMSContext
与原始JMSContext对象的事务等效。 该接口的实现为JMS中的JTA提供支持
使用方便
这些注释可以减少对手动/管理配置的依赖,并可以推动Java EE应用程序的自动部署。 这些是“配置为代码”的完美示例,在云(PaaS)部署方案中无价之宝
JMSConnectionFactoryDefinition和JMSConnectionFactoryDefinitions
指定一个/多个JMS ConnectionFactory对象的JNDI名称。 此资源将在部署时自动配置。
@JMSConnectionFactoryDefinition(name = "jndi/App1JMSConnFactory")@JMSConnectionFactoryDefinitions({@JMSConnectionFactoryDefinition(name = "jndi/App2JMSConnFactory"),@JMSConnectionFactoryDefinition(name = "jndi/App3JMSConnFactory")})
JMSDestinationDefinition和JMSDestinationDefinitions
指定一个/多个JMS目标(队列/主题)的JNDI名称。 此资源将在部署时自动配置。
@JMSDestinationDefinition(name = "jms/emailQueue", interfaceName = "javax.jms.Queue")@JMSDestinationDefinitions({@JMSDestinationDefinition(name = "portal/notificationQueue", interfaceName = "javax.jms.Queue"),@JMSDestinationDefinition(name = "app/stockPriceTopic", interfaceName = "javax.jms.Topic")})
异常处理
JMS 1.1和更早版本没有未检查异常的概念。 从JMS 2.0开始,引入JMSRuntimeException作为基础/父级,从该基础/父级扩展了所有其他未经检查的异常。 这是JMS 2.0中引入的所有新异常的列表(这些异常大多是其检查的对等物的未检查版本)
- JMSRuntimeException
- IllegalStateRuntimeException
- InvalidClientIDRuntimeException
- InvalidDestinationRuntimeException
- InvalidSelectorRuntimeException
- JMSSecurityRuntimeException
- MessageFormatRuntimeException
- MessageNotWriteableRuntimeException
- ResourceAllocationRuntimeException
- TransactionInProgressRuntimeException
- TransactionRolledBackRuntimeException
杂
JMSPasswordCrdential
在尝试使用注入的JMSContext对象进行任何操作之前,用于保护对JMS提供者的访问安全
Option 1
---------@Inject
@JMSConnectionFactory("jms/myConnectionFactory")
@JMSPasswordCredential(password = "secret", userName = "admin")
JMSContext ctx;----------------------------------------------------------------Option 2
---------//inject javax.jms.ConnectionFactory
@Resource("jndi/AppJMSConnFactory")
ConnectionFactory cf;//use it to create the JMSContext
JMSContext ctx = cf.createContext("admin","secret");
JMSSessionMode
指定在JMSContext注入期间要使用的会话模式
@Inject
@JMSConnectionFactory("jms/myConnectionFactory")
//Accepts an integer. Other options are: JMSContext.SESSION_TRANSACTED, JMSContext.CLIENT_ACKNOWLEDGE and JMSContext.DUPS_OK_ACKNOWLEDGE
@JMSSessionMode(JMSContext.AUTO_ACKNOWLEDGE)
JMSContext ctx;
从API角度来看,仅此而已。
干杯!
翻译自: https://www.javacodegeeks.com/2015/09/new-in-jms-2-0.html