关于JMS的一些介绍参见【http://blog.csdn.net/aking21alinjuju/article/details/6051421】
【补充】
消息的组成
1. 头(head)
每条JMS 消息都必须具有消息头。头字段包含用于路由和识别消息的值。可以通过多种方式来设置消息头的值:
a. 由JMS 提供者在生成或传送消息的过程中自动设置
b. 由生产者客户机通过在创建消息生产者时指定的设置进行设置
c. 由生产者客户机逐一对各条消息进行设置
2. 属性(property)
消息可以包含称作属性的可选头字段。他们是以属性名和属性值对的形式制定的。可以将属性是为消息头得扩展,其中可以包括如下信息:创建数据的进程、数据的创建时间以及每条数据的结构。JMS提供者也可以添加影响消息处理的属性,如是否应压缩消息或如何在消息生命周期结束时废弃消息。
3. 主体(body)
包含要发送给接收应用程序的内容。每个消息接口特定于它所支持的内容类型。JMS为不同类型的内容提供了他们各自的消息类型,但是所有消息都派生自Message接口。
StreamMessage 一种主体中包含Java基元值流的消息。其填充和读取均按顺序进行。
MapMessage 一种主体中包含一组键--值对的消息。没有定义条目顺序。
TextMessage 一种主体中包含Java字符串的消息(例如,XML消息)。
ObjectMessage 一种主体中包含序列化Java对象的消息。
BytesMessage 一种主体中包含连续字节流的消息。
例如:MapMessage 消息格式
【开发流程】
P2P开发模型
【生产者】
1、创建connection
1 // 根据url,user和password创建一个jms Connection。 2 ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory (user, password, url); 3 connection = connectionFactory.createConnection(); 4 connection.start();
2、创建session
/**在connection的基础上创建一个session,同时设置是否支持事务ACKNOWLEDGE标识。 • AUTO_ACKNOWLEDGE:自动确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收。 • CLIENT_ACKNOWLEDGE:客户端确认模式。会话对象依赖于应用程序对被接收的消息调用一个acknowledge()方法。一旦这个方法被调用,会话会确认最后一次确认之后所有接收到的消息。这种模式允许应用程序以一个调用来接收,处理并确认一批消息。注意:在管理控制台中,如果连接工厂的Acknowledge Policy(确认方针)属性被设置为"Previous"(提前),但是你希望为一个给定的会话确认所有接收到的消息,那么就用最后一条消息来调用acknowledge()方法。 • DUPS_OK_ACKNOWLEDGE:允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。在需要考虑资源使用时,这种模式非常有效。注意:如果你的应用程序无法处理重复的消息的话,你应该避免使用这种模式。如果发送消息的初始化尝试失败,那么重复的消息可以被重新发送。 • SESSION_TRANSACTED**/
Session session = connection.createSession(
transacted, Session.AUTO_ACKNOWLEDGE);
3、创建destination对象
//需指定其对应的主题(subject)名称,producer和consumer将根据subject来发送/接收对应的消息
if (topic) {
destination = session.createTopic(subject);
} else {
destination = session.createQueue(subject);
}
4、创建producer
1 //根据Destination创建MessageProducer对象,同时设置其持久模式。 2 MessageProducer producer = session.createProducer(destination); 3 if (persistent) { 4 producer.setDeliveryMode(DeliveryMode.PERSISTENT); 5 } else { 6 producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 7 } 8 if (timeToLive != 0) { 9 producer.setTimeToLive(timeToLive); 10 }
5、发送消息到队列 //封装TextMessage消息,使用MessageProducer的send方法将消息发送出去。
1 TextMessage message = session.createTextMessage("createMessageText"); 2 producer.send(message);
【消费者开发流程】
1、实现MessageListener接口
2、创建Connection
1 //根据url,user和password创建一个jms Connection,如果是durable模式,还需要给connection设置一个clientId。
2 ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url);
3 Connection connection = connectionFactory.createConnection();
4 if (durable && clientId != null && clientId.length() > 0 && !"null".equals(clientId)) {
5 connection.setClientID(clientId);
6 }
7 connection.setExceptionListener(this);
8 connection.start();
3、创建session和destination
与生产者类似
4、创建replayProducer【可选】
1 //可以用来将消息处理结果发送给producer。 2 replyProducer = session.createProducer(null); 3 replyProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);<span style="white-space: normal;"> </span>
5、创建MessageComsumer
1 //根据Destination创建MessageConsumer对象。 2 MessageConsumer consumer = null; 3 if (durable && topic) { 4 consumer = session.createDurableSubscriber((Topic)destination, consumerName); 5 } else { 6 consumer = session.createConsumer(destination); 7 }<span style="white-space: normal;"> </span>
6、获取消息
1 //在onMessage()方法中接收producer发送过来的消息进行处理,并可以通过replyProducer反馈信息给producer 2 if (message.getJMSReplyTo() != null) { 3 replyProducer.send(message.getJMSReplyTo(), 4 session.createTextMessage("Reply: " + message.getJMSMessageID())); 5 }
=======================================华丽丽的分割线============================================
Publish/Subscriber(发布/订阅者)消息开发模式
【订阅者】
1、 实现MessageListener接口
在onMessage()方法中监听发布者发出的消息队列,并做相应处理。
2、 创建Connection
根据url, user和password创建一个jms connection
3、 创建Session
在connection的基础上创建一个session,同时设置是否支持和ACKNOWLEDGE标志。
4、 创建 Topic
创建两个Topic,topictest.message用于接收发布者发出的消息,topictest.control用于向发布者发送消息,实现双方的交互。
5、 创建consumer和producer对象
根据topictest.message创建consumer,根据topictest.control创建producer
6、 接收处理消息
在onMessage()方法中,对收到的消息进行处理,可直接简单在本地显示消息,或者根据消息内容不同处理对应的业务逻辑(比如:数据库更新、文件操作等等),并且可以使用 producer对象处理结果返回给发布者
----------------------------------------------------------------------------小分割---------------------------------------------------------------------------------------
【发布者】
1、 实现MessageListener接口
在onMessage()方法中接收订阅者的反馈消息。
2、 创建Connection
根据url, user和password 创建一个 jms Connection。
3、 创建session
在connection的基础上创建一个session,同时设置是否支持事务和ACKNOWLEDGE标志。
4、 创建Topic
创建两个Topic,topictest.messages用于向订阅者发布消息,topictest.control用于接收订阅者反馈的消息。这两个Topic与订阅者开发流程中的topic是一一对应的。
5、 创建consumer和producer对象
根据topictest.message创建publisher;
根据topictest.contro创建consumer,同时监听订阅者反馈的消息