BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

JMS 2.0的新内容

| 作者 Vikram Gupta 关注 1 他的粉丝 ,译者 臧秀涛 关注 4 他的粉丝 发布于 2013年6月15日. 估计阅读时间: 8 分钟 | ArchSummit北京2018 共同探讨机器学习、信息安全、微服务治理的关键点

期待已久的Java EE 7终于到来了,JMS 2.0也随之而来,这是JMS十多年来的第一次升级。

在最新的JMS规范中有一点最值得注意,即Oracle称之为“简化的”API的优雅的表现力。例如,用于发送和接收消息的新API去掉了大部分样板文件,显著地减少了所需代码量。如果运行在应用服务器中,新的API还支持资源注入,允许应用服务器管理JMS对象,从而进一步简化应用。

该框架完全向后兼容,因此在新代码中使用简化的API的同时,遗留代码还可以自由使用。目前尚无弃用旧API的计划。

JMS 2.0是Java EE 7平台的一部分,但是也可以作为单独的Java SE平台使用,不过并非所有特性都支持这两种模式。

我们来比较一下分别使用旧API和新API的代码示例。

代码清单 1. JMS 1.0 发送消息的语法

1 public void sendMessage(ConnectionFactory factory,
                Queue queue, String message) { 
2    try { 
3      Connection connection = 
                factory.createConnection(); 
4      try { 
5        Session session = connection.createSession(
                false, Session.AUTO_ACKNOWLEDGE); 
6        MessageProducer messageProducer 
                 = session.createProducer(queue); 
7        TextMessage textMessage 
                 = session.createTextMessage(message); 
8     
9        messageProducer.send(textMessage); 
10 
11     } finally { 
12       connection.close(); 
13     } 
14   } catch (JMSException e) { 
15     // handle exception 
16   } 
17 }

代码清单 2. JMS 2.0 发送同样消息的语法

18 public void sendMessage(ConnectionFactory factory,
			 Queue queue, String message) { 
19   try (JMSContext context 
		= factory.createContext()) { 
20    
21     context.createProducer().send(queue, message); 
22    
23   } catch (JMSRuntimeException e) { 
24     // handle exception 
25   } 
26 } 

让我们分析一下其变化。首先,第19行使用了Java 7的“try-with-resources”。新的实现了AutoCloseable接口的JMSContext类代替了旧的Connection类和Session类。当JMSContext被包含到try语句中时(第19行),原来所有的“try”设置代码(第4、11、12和13行)都去掉了。消息创建现在也是隐式的,所以最后的代码相对于原来版本有了很大的简化。

另外,旧有的检查异常(checked exception)JMSException替换为非检查异常(unchecked exception)JMSRuntimeException,因此不再需要显式捕获。

上面是消息发送代码,消息接收代码同样简洁。

简化的API只是新的JMS 2.0 API的一部分。此外,还有一些语义增强。现在支持如下特性:

  • 异步发送模式——传统的同步模式会导致阻塞,直到收到服务器的应答。与之不同的是,异步模式会直接返回而不会阻塞。一旦收到应答,会调用一个异步回调。新的JMSProducer和遗留版本中对应的MessageProducer都支持异步模式。例如,应用可以实现下面的CompletionListener接口:
    public interface CompletionListener {
      void onCompletion(Message message);
      void onException(Message message, Exception exception);
    }

    发送消息时只需要这样调用:

    messageProducer.send(message,completionListener);
  • 延迟的消息交付——允许JMS客户端按照预定时间交付消息,支持延期处理。应用可以以毫秒为单位设置最短时间,消息系统在将消息交付给消费者之前必须保留这么长时间。
    MessageProducer和JMSProducer的API是类似的:

    MessageProducer:

    public void setDeliveryDelay(long deliveryDelay)

    JMSProducer:

    public JMSProducer setDeliveryDelay(long deliveryDelay)
  • 共享相同的订阅主题——允许可伸缩地消费来自同一订阅主题的消息。

    JMS 2.0提供了支持非持久订阅的新方法:

    MessageConsumer messageConsumer = session.
      createSharedConsumer(topic,sharedSubscriptionName);

    用于持久订阅的现有方法如下:

    MessageConsumer messageConsumer = session.
      createDurableConsumer(topic,durableSubscriptionName);

这里列出的只是诸多特性中的几种。Oracle技术网站上有一篇文章——“What's New in JMS 2.0”,列出了JMS 2.0所有的新特性,同时提供了一些示例代码,读者可以参考。

查看英文原文:What's new in JMS 2.0?

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT