JMS 2.0 的新内容

阅读数:1515 2013 年 6 月 14 日

话题:Java语言 & 开发架构

期待已久的 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?