消息中间件规范JMS 2.0的十大改进

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/8885193 消息中间件规范JMS 2.0的十大改进作者:chszs,转载需注明。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/8885193

消息中间件规范JMS 2.0的十大改进

作者:chszs,转载需注明。博客主页: http://blog.csdn.net/chszs

消息中间件规范JMS 2.0在编码方面做了很多改进,可以帮助开发者减少编写的代码量。下面,由我一一说明。

一、用JMSContext取代了Connection和Session对象

消息中间件规范JMS 2.0引入了一个新对象——JMSContext,它提供了原先Connection和Session对象同样的功能。

在JMS 1.1中是这样的:

Connection connection = ConnectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

在JMS 2.0中是这样的:

JMSContext context = connectionFactory.createContext(JMSContext.SESSIONA_TRANSACTED);

二、利用try-with-resources块意味着无需调用close语句

在JMS 1.1中如果不调用close语句,那么或许会导致内存资源耗尽。

在JMS 1.1中是这样的:

try{
Connection connection = connectionFactory.createConnection();
try{
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
} finally{
connection.close();
}
} catch(JMSException ex){
ex.printStackTrace();
}

在JMS 2.0中是这样的:

try (Connection connection = connectionFactory.createConnection();) {
......
} catch(JMSException ex){
ex.printStackTrace();
}

注意,上面的代码也可改用JMSContext。

三、在JavaSE中创建会话时无需传递两个参数


在JMS 1.1中是这样的:

Session session = connection.createSession(true,Session.SESSION_TRANSACTED);

在JMS 2.0中是这样的:

Session session = connection.createSession(Session.SESSION_TRANSACTED);

四、在JavaEE事务处理中创建会话无需传递任何参数

在JavaEE事务处理中创建会话,createSession传递的参数会被忽略掉,详见EJB 3.1规范。

在JMS 1.1中是这样的:

// 传递的两个参数都会被忽略事务的行为由容器决定
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

在JMS 2.0中是这样的:

// JMS 2中提供了无参方法
Session session = connection.createSession();

五、新的JMSProducer对象支持方法链

消息中间件规范JMS 2.0引入了一个新对象——JMSProducer,他允许消息头、消息属性、交付的选项等都在单行代码中通过方法链进行指定。

在JMS 1.1中是这样的:

MessageProducer messageProducer = session.createProducer(domoQueue);
messageProducer.setPriority(1);
TextMessage textMessage = session.createTextMessage(body);
textMessage.setStringProperty("foo", "bar");
messageProducer.send(textMessage);

在JMS 2.0中是这样的:

TextMessage textMessage = context.createTextMessage(body);
context.createProducer().setPriority(1).setProperty("foo", "bar").send(demoQueue, textMessage);

六、无需保存JMSProducer的变量

新的JMSPruducer对象是轻量级对象,因此无需在变量中保存它,当需要时直接实例化即可。

在JMS 1.1中是这样的:

// MessageProducer开销很大,因此需要重用它
MessageProducer messageProducer = session.createProducer(demoQueue);
messageProducer.send(message1);
messageProducer.send(message2);

在JMS 2.0中是这样的:

// JMSProducer是轻量级的,无需用变量保存它
context.createProducer().send(demoQueue, message1);
context.createProducer().send(demoQueue, message2);

七、在JavaEE中,注入JMSContext意味着无需创建或关闭它


在JMS 1.1中是这样的:

try{
Connection connection = connectionFactory.createConnection();
try{
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(demoQueue);
TextMessage textMessage = session.createTextMessage(body);
messageProducer.send(textMessage);
} finally{
connection.close();
}
} catch(JMSException ex){
ex.printStackTrace();
}

在JMS 2.0中是这样的:

try{
context.createProducer().send(inboundQueue, body);
} catch(JMSRuntimeException ex){
ex.printStackTrace();
}

八、当发送消息时,无需实例化消息对象


在JMS 1.1中是这样的:

// 需要创建适合类型的消息对象,再设置其Body
MessageProducer messageProducer = session.createProducer(demoQueue);
TextMessage textMessage = session.createTextMessage("Hello World");
messageProducer.send(textMessage);

在JMS 2.0中是这样的:

// 简单的传递消息Body到send方法
context.createProducer().send(demoQueue, "Hello World");

九、同步接收,可以直接接收消息有效载荷


在JMS 1.1中是这样的:

// 当同步接收时,需给定消息对象,再转换为合适的子类型,再提取Body
MessageConsumer messageConsumer = session.createConsumer(demoQueue);
TextMessage textMessage = (TextMessage)messageConsumer.receive(1000);
if(textMessage==null)
return "Received null"
else
return "Received " + textMessage.getText();

在JMS 2.0中是这样的:

// JMS 2允许直接接收消息Body
JMSConsumer consumer = context.createConsumer(demoQueue);
return "Received " + consumer.receiveBody(String.class, 1000);

十、异步接收在提取消息Body时无需转换


在JMS 1.1中是这样的:

public void onMessage(Message m){
MyObject myObj = (MyObject)((ObjectMessage)m).getObject();
...

在JMS 2.0中是这样的:

public void onMessage(Message m){
MyObject myObj = m.getBody(MyObject.class);

...


目录
相关文章
|
消息中间件 Java Kafka
一款消息队列的客户端框架——启明信息车联网MQ演进实践分享
一款消息队列的客户端框架——启明信息车联网MQ演进实践分享 分享人:阿里云MVP曾宪宇,2014开始 就职于启明信息,负责车联网平台的架构和建设,坐标吉林长春。 分享内容:结合主流MQ,介绍一款基于Java的开源消息队列客户端框架。
2951 0
一款消息队列的客户端框架——启明信息车联网MQ演进实践分享
|
4月前
|
消息中间件 存储 中间件
【主流技术】聊一聊消息队列 RocketMQ 的基本结构与概念
2.6Broker 代理服务器(Broker)是消息中转角色,负责存储消息、转发消息。代理服务器在 RocketMQ 系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。 2.7Pull Consumer 拉取式消费(Pull Consumer)是 Consumer 消费的一种类型,也是默认的类型。下游应用系统通常主动调用 Consumer 的拉消息方法从 Broke r服务器拉消息,即主动权由下游应用控制。一旦获取了批量消息,应用就会启动消费过程。
|
5月前
|
消息中间件 存储 中间件
常用几大MQ比较
rabbitmq、kafka、rocketmq比较
|
消息中间件 存储 Apache
消息中间件使用规范(RocketMQ)
消息中间件使用规范(RocketMQ)
4144 7
|
12月前
|
消息中间件 Java 数据库连接
50分布式电商项目 - JMS
50分布式电商项目 - JMS
24 0
|
消息中间件 存储 Cloud Native
技术盘点:消息中间件的过去、现在和未来
目前以“事件驱动”构建的数字化商业生态才刚起步,未来 EventBridge 将围绕事件这一抽象层次实现更强大的能力,比如事件的全链路可观测、事件分析计算、低代码开发等特性,帮助企业全面落地云时代的“事件驱动”架构。
266 5
技术盘点:消息中间件的过去、现在和未来
|
消息中间件 监控 中间件
阿里云互联网中间件五剑客之——消息队列 MQ
阿里云互联网中间件五剑客之——消息队列 MQ自制脑图, 是阿里巴巴集团自主研发的专业消息中间件。 产品基于高可用分布式集群技术,提供消息订阅和发布、消息轨迹查询、定时(延时)消息、资源统计、监控报警等一系列消息云服务。
1026 6
阿里云互联网中间件五剑客之——消息队列 MQ
|
消息中间件 存储 Cloud Native
技术盘点:消息中间件的过去、现在和未来
目前以“事件驱动”构建的数字化商业生态才刚起步,未来 EventBridge 将围绕事件这一抽象层次实现更强大的能力,比如事件的全链路可观测、事件分析计算、低代码开发等特性,帮助企业全面落地云时代的“事件驱动”架构。
技术盘点:消息中间件的过去、现在和未来
|
消息中间件 Kafka RocketMQ
业界主流MQ对比
根据之前的学习和沉淀,本期我们总结了几款业界主流消息中间件产品的对比报告。
25923 10
|
消息中间件 监控 关系型数据库
下一篇
无影云桌面