JMS 2.0的新增功能

这篇文章列出了JMS 2.0Java 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)部署方案中无价之宝

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值