QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

JMS 2.0 的新内容

  • 2013-06-14
  • 本文字数:1845 字

    阅读完需:约 6 分钟

期待已久的 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](http://www.oracle.com/technetwork/articles/java/jms20-1947669.html)”,列出了 JMS 2.0 所有的新特性,同时提供了一些示例代码,读者可以参考。
** 查看英文原文:**[**What's new in JMS 2.0?**](http://www.infoq.com/news/2013/06/JMS_2.0_Released)
2013-06-14 07:212288
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 136.2 次阅读, 收获喜欢 35 次。

关注

评论

发布
暂无评论
发现更多内容

九科祝福丨人生不设限,愿你自由绽放

九科Ninetech

Kubernetes 部署主从结构的 MySQL 服务

CTO技术共享

CorelDRAW矢量图形设计软件2023最新版本功能介绍

茶色酒

CorelDraw2023

三天吃透Kafka面试八股文

程序员大彬

Java Kafka Producer

软件测试/测试开发 | Spring Boot 异常处理

测试人

软件测试 springboot 自动化测试 测试发开

那些年,我们写过的无效单元测试

阿里巴巴中间件

阿里云 编程 云原生

网易云信 Crash 异常治理实践 | 智企技术委员会技术专题系列

网易云信

系统设计 异常处理

GitHub破千Star!Java多线程编程实战指南:核心篇+设计模式篇

做梦都在改BUG

Java 并发编程 多线程

如何降低 Flink 开发和运维成本?阿里云实时计算平台建设实践

Apache Flink

大数据 flink 实时计算

关于微服务系统中数据一致性的总结

做梦都在改BUG

Java 微服务 数据一致性

软件测试/测试开发 | 数据持久化技术(Java)

测试人

软件测试 测试发开

预售登上计算机新书热卖榜TOP1,开年重磅,助力Java程序员飙升核心技能

图灵教育

Spring boot starter test java 后端、 程序员 java

一个可以早点下班的开发技巧

引迈信息

前端 敏捷开发 低代码 JNPF

构建一个可复用的自定义BaseAdapter

芯动大师

Adapter viewholder item

Centos7下安装Dogtail GUI自动化测试工具并打开sniff工具过程中遇到的问题解决方法

Python centos 自动化测试 sniff dogtail

Gartner首次针对中国市场发布产业数字化白皮书,联合卡奥斯共探区域经济发展最优解

Openlab_cosmoplat

数字化 产业数字化 白皮书 开源社区 Gartner

预售登上计算机新书热卖榜TOP1,开年重磅,助力Java程序员飙升核心技能

图灵社区

Spring boot starter test java 后端、 程序员 java

C++ sort和for_each算法的普通、文艺和2B用法

老王同学

c++ 排序

EasyRecovery16数据恢复软件有哪些新功能?

茶色酒

EasyRecovery Photo16

2023年适用于Windows和Mac的FTP传输工具

镭速

我在京东做研发丨【混合多云第一课】为何多云多活被称为“技术皇冠上的明珠”?

京东科技开发者

京东云 研发 混合多云

Dubbo 在 Proxyless Mesh 模式下的探索与改进

阿里巴巴中间件

阿里云 云原生 dubbo

ERP和MES如何做到优势互补,它们的区别在哪?

工赋开发者社区

字典数据结构 FST(Finite State Transducer)

alexgaoyh

Java Trie FST dat 字典数据结构

如何让SpringBoot项目启动时执行特定代码

做梦都在改BUG

Java Spring Boot

直播预约|Search for Future,阿里云 × Elastic 中国用户峰会 2023

阿里云大数据AI技术

大数据 阿里云 搜索

【经验分享】电路板上电就挂?新手工程师该怎么检查PCB?

华秋PCB

工程师 电路 PCB PCB设计

Redis缓存知识大集合

阿呆

redis 缓存 缓存击穿 缓存雪崩

黑盒测试方法—等价类划分法

测吧(北京)科技有限公司

测试

工赋开发者社区 | 关于ChatGPT八个技术问题的猜想

工赋开发者社区

SpringApplication启动类的Args详解

石臻臻的杂货铺

spring springboot

JMS 2.0的新内容_Java_Vikram Gupta_InfoQ精选文章