JMS 2.0的新增功能
這篇文章列出了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)部署方案中無價之寶
JMSConnectionFactoryDe??finition和JMSConnectionFactoryDe??finitions
指定一個/多個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
總結
以上是生活随笔為你收集整理的JMS 2.0的新增功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没交维修基金能备案吗(没交维修基金能备案
- 下一篇: 霍廷格vs阿鲁巴——受欢迎并不意味着更好