JMS规范及相关实现
来源:互联网 发布:淘宝菜鸟驿站怎么加入 编辑:程序博客网 时间:2024/06/08 19:06
JMS是一种应用于异步消息传递的标准API,作为Java平台的一部分,JMS可以允许不同应用、不同模块之间实现可靠、异步数据通信。
在JMS中,支持两种消息模型,点对点(Point-to-point)和发布-订阅(Publish and subscribe),这两种模式分别对应于JMS中的两种消息目标(Message Destination):队列及主题。
在点对点模型中,每个消息都有一个发送者和一个接收者,消息中介(broker)收到发送者的消息,会将消息放入队列中,而接收者请求并接收队列中的一条消息后,这条消息就会从队列中删除。消息队列中的每条消息只能投递给一个接收者,但并不意味着只能使用一个接收者从队列中取消息,根据业务需要,可以使用多个接收者同时从队列中请求消息,分担处理压力。但是需要注意的是,单个接收者收到的消息是按照发送顺序的,多个接收者因为多线程的关系,并不能保证收到的消息一定是原序的。
在发布-订阅模式中,消息会发送给一个主题,但是与点对点模式不同的是消息不再只被投递给一个接收者,而是所有此主题的订阅者都会收到该消息。
JMS消息类型
在JMS1.1规范中,定义了五种消息类型,分别为:
1.StreamMessage :消息体是 Java 流,写入和读出都是顺序的
2.MapMessage :消息体包含 key-value 对, key 为 String , value 为基本类型,可以通过迭代器访问
3.TextMessage :消息体是 String
4.ObjectMessage :消息体是可序列化的 Java 对象
5.BytesMessage :消息体是字节数组
JMS消息头
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 创建2个目的地Destination destination = session.createQueue("JMS.DEMO");Destination destination2 = session.createQueue("JMS.DEMO2");// 创建生产者MessageProducer publisher = session.createProducer(destination);// 设置传输模式publisher.setDeliveryMode(DeliveryMode.PERSISTENT);// 创建消息TextMessage message = session.createTextMessage("Test Message");// 设置消息的目的地为destination2message.setJMSDestination(destination2);// 发送消息publisher.send(message);System.out.println(message.getJMSDestination());代码中,通过 message.setJMSDestination(destination2); 设置了 message 的 JMSDestination 消息头属性值,我们再看看其输出结果
queue://JMS.DEMO
看下面的例子
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 创建目的地Destination destination = session.createQueue("JMS.DEMO");// 创建生产者MessageProducer publisher = session.createProducer(destination);// 设置传输模式publisher.setDeliveryMode(DeliveryMode.PERSISTENT);// 发送PERSISTENT消息publisher.send(session.createTextMessage("PERSISTENT MESSAGE"));// 设置传输模式publisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);// 发送PERSISTENT消息publisher.send(session.createTextMessage("NON_PERSISTENT MESSAGE"));例子中分别发送了一条 PERSISTENT 的消息和一条 NON_PERSISTENT 的消息;当 Active MQ 重启后,启动消费端,收到的消息如下
PERSISTENT MESSAGE
4.JMSReplyTo
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 创建目的地Destination destination = session.createQueue("JMS.DEMO");Destination destination2 = session.createQueue("JMS.DEMO3");// 创建生产者MessageProducer publisher = session.createProducer(destination);// 设置传输模式publisher.setDeliveryMode(DeliveryMode.PERSISTENT);// 创建消息TextMessage message = session.createTextMessage("Test Message");message.setJMSReplyTo(destination2);// 发送消息publisher.send(message);
接收端(可以根据情况决定是否需要回复)
public void onMessage(Message message) { try { System.out.println("Receive message: " + message); if (message.getJMSReplyTo() != null) { session.createProducer(message.getJMSReplyTo()).send(session.createTextMessage("This is a reply to" + message.getJMSReplyTo())); } } catch (Exception e) { e.printStackTrace(); }}
5.JMSRedelivered
6.JMSExpiration
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 创建目的地Destination destination = session.createQueue("JMS.DEMO");// 创建生产者MessageProducer publisher = session.createProducer(destination);// 设置传输模式publisher.setDeliveryMode(DeliveryMode.PERSISTENT);// 创建消息TextMessage message = session.createTextMessage("Test Message");// 发送消息publisher.setTimeToLive(5000);publisher.send(message);
7.JMSPriority
消息属性
1.属性名
属性名必须服务消息选择器的命名规则
2.属性值
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 创建目的地Destination destination = session.createQueue("JMS.DEMO");// 创建生产者MessageProducer publisher = session.createProducer(destination);// 设置传输模式publisher.setDeliveryMode(DeliveryMode.PERSISTENT);// 创建消息TextMessage message = session.createTextMessage("Test Message");// 发送消息message.setObjectProperty("myProp", new HashMap() { { this.put("key1", "value1"); this.put("key2", "value2"); }});publisher.send(message);
JMS实现(Provider implementations)
要使用JMS,必须要有相应的实现来管理session以及队列,从Java EE1.4开始,所有的Java EE应用服务器必须包含一个JMS实现。
Ref from:
1.http://en.wikipedia.org/wiki/Java_Message_Service
2.Spring in Action
3.http://goldendoc.iteye.com/blog/1155647
- JMS规范及相关实现
- JMS学习及相关理解
- jms规范
- jms规范
- JMS规范
- JMS规范
- JMS相关
- JMS相关
- JMS相关
- Servlet规范及实现
- jms规范下载
- JMS 规范简介
- JMS规范要点
- JMS规范基础
- 9.JMS规范
- ActiveMQ 02 JMS规范
- spring 下 配置jms messageListener 的事务及相关问题
- JMS规范介绍(1) JMS消息
- JUnit(>4.0)@BeforeClass、@Before、@Test、@After、@AfterClass、@Ignore
- ORACLE profile系列3 --resource_parameters以及password_parameters
- SQL语句执行效率及分析
- spring3.2.3常用配置学习一【PropertyPlaceholderConfigurer】
- 程序员的编程、调试、排错小建议
- JMS规范及相关实现
- 1602液晶显示程序(C语言详细解说)
- Fix Some bytes have been replaced with the Unicode substitution character while loading file XXX.cs
- 移植MonkeyRunner的图片对比和获取子图功能的实现-Appium篇
- HDU4144 Bacon's Cipher
- 原創 無線網路細部設定之含義
- 【LeetCode】Remove Nth Node From End of List
- cocoapod卡在了analyzing dependencies
- #墙裂推荐Boost regex# C,C++11,Boost三种regex库性能比较