这篇文章列出了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
@Resource
ConnectionFactory cf;
//application managed
JMSContext ctx;
@Resource("jms/emailQ")
Destination emailQ;
@POST
public 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 method
ctx.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;
@POST
public 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