写点什么

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:212545
用户头像
臧秀涛 略懂技术的运营同学。

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

关注

评论

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

排序子序列与倒置字符串

未见花闻

7月月更

Zabbix 6.0 源码安装以及 HA 配置

耳东@Erdong

zabbix ha 7月月更 zabbix 6.0

zookeeper-watcher的javaApi相关使用

zarmnosaj

7月月更

Spring cloud 之限流

Damon

7月月更

Mysql 温故知新系列「触发器详解」

安逸的咸鱼

MySQL 7月月更

一款强大的mock数据生成工具

Xd

Dockerfile中的保留字指令讲解

宁在春

Docker Dockerfile 7月月更

uni-app进阶之自定义【day13】

恒山其若陋兮

7月月更

使用kitti数据集实现自动驾驶——发布照片、点云、IMU、GPS、显示2D和3D侦测框

秃头小苏

7月月更 kitti

Python 迭代器介绍及其作用

宇宙之一粟

Python 迭代器 7月月更

NFT市场格局仍未变化,Okaleido能否掀起新一轮波澜?

股市老人

云原生(六) | Docker篇之实战Dockerfile

Lansonli

Docker 云原生 7月月更

分布式系统中数据存储方案实践

Java 架构

【Docker 那些事儿】容器网络(下篇)

Albert Edison

Docker Kubernetes 容器 云原生 7月月更

在线摇骰子色子工具

入门小站

工具

「分享」从Mybatis源码中,学习到的10种设计模式

小傅哥

设计模式 小傅哥 mybatis 大厂面试 面试问题

王者荣耀商城异地多活架构设计

地下地上

架构实战营

linux之realpath命令

入门小站

Linux

在线SQL转文本工具

入门小站

工具

认识区块链和比特币

沃德

程序员 7月月更

python文件操作知多少

迷彩

Python基础 文件操作 7月月更

鲲鹏代码迁移工具基础知识

乌龟哥哥

7月月更

Block在开发中的实践应用

NewBoy

ios 前端 移动端 iOS 知识体系 7月月更

关于InnoDB表数据和索引数据的存储

程序员欣宸

MySQL innodb MySQL InnoDB 7月月更

C#入门系列(二十三) -- 分部类和抽象类

陈言必行

7月月更

ArkUI开发框架组件的生命周期详解

坚果

HarmonyOS OpenHarmony Open Harmony 7月月更

Qt | 控件之QComboBox

YOLO.

qt 7月月更

Android gradle常用

沃德

android Gradle 7月月更

Unity实战问题-WebGL问题集锦-上篇

芝麻粒儿

Unity 7月月更

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