JMS介绍
2015-12-30 22:53
363 查看
一、JMS 概要
JMS(Java Message Service):Java消息服务是SUN公司开发的一套访问MOM(Message-Oriented-Middleware)消息服务中间件的标准API,MON提供消息接收和转发的服务,对消息进行缓存和持久操作,保证消息的安全性,JMS让开发者都无须了解远程过程调用的细节和网络通信协议的细节就可以通过JMS向MOM发送消息,借助消息我们可以松散耦合的方式集成不同的应用。
二、JMS异步通信
JMS支持异步消息机制,消息生产者发送消息到MOM,消息消费者甚至可以不在线,MOM会暂存消息,当消息消费者上后,MOM会将消息发给消息消费者,消息生产者不必等消息消费者,这种异步消息机制在很多系统中是非常重要的。
三、消息类型
1.P2P (Point to Point) 点对点
生产的消息会放在一个队列中,消费者从队列中取走消息,消息一旦被取走,就会从队列中删除,多个观察都观察一个队列,但一个消息只能被一个消费取走。
2.Pub/Sub (Publish/Subscribe) 发布/订阅
用称为主题 (Topic) 的内容分层结构代替了 P2P 模型中的唯一的目的地,一个发布者可以将消息发布到某个主题下面,订阅了该主题的订阅者就可以收到这个消息。
四、JMS 受管理的对象
在JMS之前,各MOM产品都提供了专有的API访问其产品,JMS通过MOM产品为Java程序提供了一个发送消息接受消息的标准,用JMS写的应用可以在任何实现JMS标准的MOM产品上运行。
各MOM产品实现技术和机制存在很大的差别,为保持JMS客户端的可移植性,实现了JMS接口的对象必须与MOM产品的专门技术进行隔离,完成这项工作的机制是管理对象。
这些JMS接口的对象由提供者消息系统管理员创建,并放置在JNDI的空间中,然后由JMS检索这些对象,通过JMS接口访问这些对象,JMS提供者必须提供创建管理对象的方法,受管对象存放于JNDI。JMS 程序只要知道受管对象的 JNDI 名称和 JMS 接口类型就可以了。
两个重要的受管对象:
1)ConnectionFacory:用于创建到提供者底层消息系统的连接。
2)Destination:用于指定 JMS 客户端发送消息的目的地或接收消息的来源。
五、JMS接口
JMS的两个版本:JMS1.1、JMS1.02,区别:
JMS1.1 将两种消息统一进行处理,透明地操作两种消息域。
JMS1.02 区别对待两种消息域,针对每种消息域提供了高级接口的子接口。
六、JMS程序的基本步骤
1.通过JNDI查找ConnectionFactory
2.通过ConnectionFactory创建一个Connection
3.用Connection创建一个或者多个Session
4.通过JNDI查询一个或多个Destination
5.用Session和Destination创建对应的MessageProducer或MessageConsumer
6.启动Conneciton
7.发送或接收消息
关系是:
ConnectionFactory=>Connection=>Session=>Message
Destination + Session=>Producer
Destination + Session=>MessageConsumer
七、JMS消息的结构
1.Header 消息头部
JMSMessageID 一个字符串用来唯一标示一个消息
JMSDestination 消息的目的地,Topic或者是Queue
JMSDeliveryMode 消息的发送模式:persistent或nonpersistent。前者表示
消息在被消费之前,如果JMS提供者DOWN了,重新启
动后消息仍然存在。后者在这种情况下表示消息会被丢
失。可以通过下面的方式设置:
Producer.setDeliveryMode
(DeliveryMode.NON_PERSISTENT);
JMSTimestamp 当调用send()方法的时候,JMSTimestamp会被自动设
置为当前事件。可以通过下面方式得到这个值:
long timestamp = message.getJMSTimestamp();
JMSExpiration 表示一个消息的有效期。只有在这个有效期内,消息
消费者才可以消费这个消息。默认值为0,表示消息永
不过期。可以通过下面的方式设置:
producer.setTimeToLive(3600000);
//有效期1小时 (1000毫秒 * 60秒 * 60分)
JMSPriority 消息的优先级。0-4为正常的优先级,5-9为高优先级。
可以通过下面方式设置:
producer.setPriority(9);
JMSCorrelationID 通常用来关联多个Message。例如需要回复一个消息,
可以把JMSCorrelationID设置为所收到的消息的
JMSMessageID
JMSReplyTo 有时消息生产者希望消费者回复一个消息,
JMSReplyTo为一个Destination,表示需要回复的目的
地。当然消费者可以不理会它
JMSType 表示消息体的结构,和JMS提供者有关
JMSRedelivered 如果这个值为true,表示消息是被重新发送了。因为有
时消费者没有确认他已经收到消息或者JMS提供者不
确定消费者是否已经收到
2.Properties 消息属性
JMSX 开头的是 JMS 专用的
JSM_ 开头的是提供者专用的
3.Body 消息内容
TextMessage 普通字符串消息,包含一个String
ObjectMessage 对象消息,包含一个可序列化的Java 对象
MapMessage 一个Map类型的消息;名称为 string 类型,而值为 Java 的基本类型
BytesMessage 二进制数组消息,包含一个byte[]
StreamMessage Java 数据流消息,用标准流操作来顺序的填充和读取
XMLMessage 一个XML类型的消息
八、JMS消息收发机制
1.JMS事务
2.JMS消息确认
消息确认是收到消息发送一个回执确认收到消息,有三种确认方式:
Session.ATUO_ACKNOWLEDGE 接收到消息自动发送这一个确认
Session.CLIENT_ACKNOWLEDGE 调用 Meeage#acknowledge() 方法 , 显示发送确认
Session.DUPS_OK_ACKNOWLEDGE 延时发送消息 , 但可能有重复接收消息的问题
3.JMS消息过滤
九、应用示例
转自:http://blog.csdn.net/lilp_ndsc/article/details/4211799
http://blog.csdn.net/wl_ldy/article/details/7884534
JMS(Java Message Service):Java消息服务是SUN公司开发的一套访问MOM(Message-Oriented-Middleware)消息服务中间件的标准API,MON提供消息接收和转发的服务,对消息进行缓存和持久操作,保证消息的安全性,JMS让开发者都无须了解远程过程调用的细节和网络通信协议的细节就可以通过JMS向MOM发送消息,借助消息我们可以松散耦合的方式集成不同的应用。
二、JMS异步通信
JMS支持异步消息机制,消息生产者发送消息到MOM,消息消费者甚至可以不在线,MOM会暂存消息,当消息消费者上后,MOM会将消息发给消息消费者,消息生产者不必等消息消费者,这种异步消息机制在很多系统中是非常重要的。
三、消息类型
1.P2P (Point to Point) 点对点
生产的消息会放在一个队列中,消费者从队列中取走消息,消息一旦被取走,就会从队列中删除,多个观察都观察一个队列,但一个消息只能被一个消费取走。
2.Pub/Sub (Publish/Subscribe) 发布/订阅
用称为主题 (Topic) 的内容分层结构代替了 P2P 模型中的唯一的目的地,一个发布者可以将消息发布到某个主题下面,订阅了该主题的订阅者就可以收到这个消息。
四、JMS 受管理的对象
在JMS之前,各MOM产品都提供了专有的API访问其产品,JMS通过MOM产品为Java程序提供了一个发送消息接受消息的标准,用JMS写的应用可以在任何实现JMS标准的MOM产品上运行。
各MOM产品实现技术和机制存在很大的差别,为保持JMS客户端的可移植性,实现了JMS接口的对象必须与MOM产品的专门技术进行隔离,完成这项工作的机制是管理对象。
这些JMS接口的对象由提供者消息系统管理员创建,并放置在JNDI的空间中,然后由JMS检索这些对象,通过JMS接口访问这些对象,JMS提供者必须提供创建管理对象的方法,受管对象存放于JNDI。JMS 程序只要知道受管对象的 JNDI 名称和 JMS 接口类型就可以了。
两个重要的受管对象:
1)ConnectionFacory:用于创建到提供者底层消息系统的连接。
2)Destination:用于指定 JMS 客户端发送消息的目的地或接收消息的来源。
五、JMS接口
JMS的两个版本:JMS1.1、JMS1.02,区别:
JMS1.1 将两种消息统一进行处理,透明地操作两种消息域。
JMS1.02 区别对待两种消息域,针对每种消息域提供了高级接口的子接口。
高级接口 | P2P 域子接口 | Pub/Sub 域子接口 |
ConnectionFactory | QueueConnectionFactory | TopicConnectionFactory |
Connection | QueueConnection | TopicConnection |
Destination | Queue | Topic |
Session | QueueSession | TopicSession |
MessageProducer | QueueSender | TopicPublisher |
MessageConsumer | QueueReceiver QueueBrowser | TopicSubscriber |
1.通过JNDI查找ConnectionFactory
2.通过ConnectionFactory创建一个Connection
3.用Connection创建一个或者多个Session
4.通过JNDI查询一个或多个Destination
5.用Session和Destination创建对应的MessageProducer或MessageConsumer
6.启动Conneciton
7.发送或接收消息
关系是:
ConnectionFactory=>Connection=>Session=>Message
Destination + Session=>Producer
Destination + Session=>MessageConsumer
七、JMS消息的结构
1.Header 消息头部
JMSMessageID 一个字符串用来唯一标示一个消息
JMSDestination 消息的目的地,Topic或者是Queue
JMSDeliveryMode 消息的发送模式:persistent或nonpersistent。前者表示
消息在被消费之前,如果JMS提供者DOWN了,重新启
动后消息仍然存在。后者在这种情况下表示消息会被丢
失。可以通过下面的方式设置:
Producer.setDeliveryMode
(DeliveryMode.NON_PERSISTENT);
JMSTimestamp 当调用send()方法的时候,JMSTimestamp会被自动设
置为当前事件。可以通过下面方式得到这个值:
long timestamp = message.getJMSTimestamp();
JMSExpiration 表示一个消息的有效期。只有在这个有效期内,消息
消费者才可以消费这个消息。默认值为0,表示消息永
不过期。可以通过下面的方式设置:
producer.setTimeToLive(3600000);
//有效期1小时 (1000毫秒 * 60秒 * 60分)
JMSPriority 消息的优先级。0-4为正常的优先级,5-9为高优先级。
可以通过下面方式设置:
producer.setPriority(9);
JMSCorrelationID 通常用来关联多个Message。例如需要回复一个消息,
可以把JMSCorrelationID设置为所收到的消息的
JMSMessageID
JMSReplyTo 有时消息生产者希望消费者回复一个消息,
JMSReplyTo为一个Destination,表示需要回复的目的
地。当然消费者可以不理会它
JMSType 表示消息体的结构,和JMS提供者有关
JMSRedelivered 如果这个值为true,表示消息是被重新发送了。因为有
时消费者没有确认他已经收到消息或者JMS提供者不
确定消费者是否已经收到
2.Properties 消息属性
JMSX 开头的是 JMS 专用的
JSM_ 开头的是提供者专用的
3.Body 消息内容
TextMessage 普通字符串消息,包含一个String
ObjectMessage 对象消息,包含一个可序列化的Java 对象
MapMessage 一个Map类型的消息;名称为 string 类型,而值为 Java 的基本类型
BytesMessage 二进制数组消息,包含一个byte[]
StreamMessage Java 数据流消息,用标准流操作来顺序的填充和读取
XMLMessage 一个XML类型的消息
八、JMS消息收发机制
1.JMS事务
session = conn.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);true 表示这个会话是事务性的,需要显式的commit 或者rollback ()。
2.JMS消息确认
消息确认是收到消息发送一个回执确认收到消息,有三种确认方式:
Session.ATUO_ACKNOWLEDGE 接收到消息自动发送这一个确认
Session.CLIENT_ACKNOWLEDGE 调用 Meeage#acknowledge() 方法 , 显示发送确认
Session.DUPS_OK_ACKNOWLEDGE 延时发送消息 , 但可能有重复接收消息的问题
3.JMS消息过滤
MessageConsumer consumer=session.createConsumer(destination,过滤条件);
九、应用示例
/** * @author Administrator * @desctiption 结合一个例子,深入理解JMS的基本概念 * 消息的消费者接收消息可以采用两种方式: * 1、consumer.receive() 或 consumer.receive(int timeout); * 2、注册一个MessageListener。 * 采用第一种方式,消息的接收者会一直等待下去,直到有消息到达,或者超时。 * 后一种方式会注册一个监听器,当有消息到达的时候,会回调它的onMessage()方法。 */ package com.wl.jms; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.MessageListener; import javax.jms.MessageProducer; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.command.ActiveMQQueue; public class MessageSendAndReceive { /** * @param args * @throws JMSException */ public static void main(String[] args) throws JMSException { // TODO Auto-generated method stub ConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost"); Connection connection = factory.createConnection(); connection.start(); //创建消息的Destination Queue queue = new ActiveMQQueue("testQueue"); final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //创建将要发送的消息 Message message = session.createTextMessage("Hello JMS!"); //创建消息生产者发送消息 MessageProducer producer = session.createProducer(queue); producer.send(message); System.out.println("Send Message Completed!"); //创建消息的接收者 MessageConsumer comsumer = session.createConsumer(queue); //消息的消费者接收消息的第一种方式:consumer.receive() 或 consumer.receive(int timeout); //Message recvMessage = comsumer.receive(); //System.out.println(((TextMessage)recvMessage).getText()); //消息的消费者接收消息的第二种方式:注册一个MessageListener comsumer.setMessageListener(new MessageListener(){ public void onMessage(Message msg) { // TODO Auto-generated method stub TextMessage textMsg=(TextMessage)msg; try { System.out.println(textMsg.getText()); } catch (JMSException e) { e.printStackTrace(); } } }); } }
转自:http://blog.csdn.net/lilp_ndsc/article/details/4211799
http://blog.csdn.net/wl_ldy/article/details/7884534
相关文章推荐
- C#基于UDP实现的P2P语音聊天工具
- python实现的一个p2p文件传输实例
- EJB3.0 JBoss的JMS实例
- ActiveMQ 消息服务(一)
- ActiveMQ 消息服务(二)
- ActiveMQ 消息服务(三)
- Spring+Log4j+ActiveMQ实现远程记录日志——实战+分析
- JMS-使用消息队列优化网站性能
- 架构优化 - 应用,MQ Broker,业务处理分层
- 路由器封P2P的终极方案
- Destination Host Unreachable和Destination Net Unreachable
- jms异步通信全攻略
- JMS
- IPTV技术的主要发展趋势
- 2008最新P2P流量监控与管理解决方案
- WATM突破用户应用财务系统的死角
- Vigor之IM/P2P/VoIP内容安全管理功能详解
- P2P--大文件分发网络的搭建
- 律师成P2P备案最大赢家?中介律师费水涨船高!