(二)ActiveMQ 点对点系统模型
来源:互联网 发布:像素软件招聘 编辑:程序博客网 时间:2024/05/29 15:01
ActiveMQ 客户端编写支持Java, C, C++ 等多种语言,笔者使用Java 语言来实现。测试模型为:一个生产者生产消息,两个消费者消费消息。
1. 引入jar 包
引入activemq-all-5.13.1.jar, 解压apache-activemq-5.13.1-bin.zip 压缩包,里面有。 如果用maven3, 那么添加Dependency
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.13.1</version></dependency>
2. 源程序
【1. 生产者一】
package org.zgf.learn.learn.jms.activemq.p2p;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageProducer;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;/** * JMS 生产者 */public class JMSProducer {//设置默认的用户名、密码、连接地址private static final String USE = ActiveMQConnection.DEFAULT_USER;private static final String PASSWORD= ActiveMQConnection.DEFAULT_PASSWORD;private static final String BOOKERURL = ActiveMQConnection.DEFAULT_BROKER_URL;public static void main(String[] args) throws Exception{//1. 创建JMS 连接工程ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USE, PASSWORD,BOOKERURL);//2. 创建JMS 连接Connection connection = connectionFactory.createConnection();//3. 启动JMS 连接connection.start();//4. 创建JMS 会话,需要开启事务,提交方式为自动提交Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);//5. 创建JMS 消息队列Destination destination = session.createQueue("p2pMsgQueue1");//6. 创建JMS 消息生产者MessageProducer messageProducer = session.createProducer(destination);//7. 创建JMS 消息(创建最简单的消息, 文本消息)TextMessage textMessage = session.createTextMessage("hello,world! [" + System.currentTimeMillis() + "]");//8. JMS 消息生产者 发送 JMS消息messageProducer.send(textMessage);//9. 提交事务session.commit();System.out.println("【生成者】消息发送成功");closeConn(connection,session);}private static void closeConn(Connection connection, Session session){if(null != session){try {session.close();} catch (JMSException e) {e.printStackTrace();}finally {if(connection != null){try {connection.close();} catch (JMSException e) {e.printStackTrace();}}}}}}
【2. 消费者一】
package org.zgf.learn.learn.jms.activemq.p2p;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.MessageConsumer;import javax.jms.Session;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;/** * JMS 消费者一 */public class JMSCustumer1 { //设置默认的用户名、密码、连接地址 private static final String USE = ActiveMQConnection.DEFAULT_USER; private static final String PASSWORD= ActiveMQConnection.DEFAULT_PASSWORD; private static final String BOOKERURL = ActiveMQConnection.DEFAULT_BROKER_URL; public static void main(String[] args) throws Exception{ //1. 创建JMS 连接工程 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USE, PASSWORD,BOOKERURL); //2. 创建JMS 连接 Connection connection = connectionFactory.createConnection(); //3. 启动JMS 连接 connection.start(); //4. 创建JMS 会话,不需要开启事务,提交方式为自动提交 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5. 创建JMS 消息队列 Destination destination = session.createQueue("p2pMsgQueue1"); //6. 创建JMS 消息消费者 MessageConsumer messageConsumer = session.createConsumer(destination); //7. 为消费者设置监听器 messageConsumer.setMessageListener(new JMSTextMsgListener("消费 者一")); System.out.println("消费者一开始监听...."); //不能关闭连接,关闭之后就不能接受到消息了 } }
【3. 消费者二】
package org.zgf.learn.learn.jms.activemq.p2p;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.MessageConsumer;import javax.jms.Session;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;/** * JMS 消费者二 */public class JMSCustumer2 {//设置默认的用户名、密码、连接地址private static final String USE = ActiveMQConnection.DEFAULT_USER;private static final String PASSWORD= ActiveMQConnection.DEFAULT_PASSWORD;private static final String BOOKERURL = ActiveMQConnection.DEFAULT_BROKER_URL;public static void main(String[] args) throws Exception{//1. 创建JMS 连接工程ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USE, PASSWORD,BOOKERURL);//2. 创建JMS 连接Connection connection = connectionFactory.createConnection();//3. 启动JMS 连接connection.start();//4. 创建JMS 会话,不需要开启事务,提交方式为自动提交Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//5. 创建JMS 消息队列Destination destination = session.createQueue("p2pMsgQueue1");//6. 创建JMS 消息消费者MessageConsumer messageConsumer = session.createConsumer(destination);//7. 为消费者设置监听器messageConsumer.setMessageListener(new JMSTextMsgListener("消费者二"));System.out.println("消费者二开始监听....");//不能关闭连接,关闭之后就不能接受到消息了}}
【4. 消息监听器】
package org.zgf.learn.learn.jms.activemq.p2p;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;/** * JMS 文本消息监听器 * */public class JMSTextMsgListener implements MessageListener{//消费者名称private final String customerName ;public JMSTextMsgListener(String customerName) {this.customerName = customerName;}@Overridepublic void onMessage(Message message) {//1. 强制转换消息TextMessage textMessage = (TextMessage) message;//2. 获取接收到的消息内容try {String msgContent = textMessage.getText();System.out.println("【" + this.customerName + "】接受到的消息内容为:" + msgContent);} catch (JMSException e) {e.printStackTrace();}}}
3. 测试用例
0. 测试之前Activemq 中消息队列为空
1. 生产者生产并发送两条消息, 此时在web浏览器中可以看到:
未被消费的消息:2 , 当前消费者个数:0, 消息入队个数:2, 消息出队:0
2. 启动消费者一, 由于目前消息队列中存在两条未消费的消息,所以消费者一会立即消费这两条消息。
未被消费的消息:0 , 当前消费者个数:1, 消息入队个数:2, 消息出队:2
消费者一控制台打印结果:
3. 启动消费者二 , 由于目前消息队列中没有被消息的消息,所以消费者二不消费任何消息, 此时有两个消费者在监听。
未被消费的消息:0 , 当前消费者个数:1, 消息入队个数:2, 消息出队:2
消费者二控制台打印结果:
4. 生产者每次发送一条消息,会发现,消费者一和消费者二进行轮流消费消息,消费顺序按启动监听的顺序进行。
4. 总结
1. 在点对点模型中,未被消费的消息会存储在activeMQ 队列中
2. 当一个生产者拥有多个消费者时,多个消费者将按照监听顺序轮流消费消息
3. 切记一条消息只能被一个消费者消费。
- (二)ActiveMQ 点对点系统模型
- ActiveMQ入门:点对点模型
- ActiveMQ 点对点消息传送模型
- ActiveMQ 点对点(p2p)
- 消息队列-ActiveMQ学习笔记(二)-点对点消息实现
- 消息队列-ActiveMQ学习笔记(二)-点对点消息实现
- ActiveMQ点对点模式(PTP)
- (三)ActiveMQ 发布订阅系统模型
- ActiveMQ 实现点对点的消息模型小Demo
- activeMQ之点对点(PTP),监听器模式
- Spring整合activeMq(一):点对点模式
- activeMq的点对点发送
- ActiveMQ 点对点消息实现
- Activemq点对点模式
- activemq点对点模式
- ActiveMQ点对点消息实现
- ActiveMQ 点对点模式
- ActiveMQ实战(二)--ActiveMQ的通信方式之P2P点对点通信(point-to-point)
- JDK,JRE,JVM区别与联系
- Android获取当前位置信息,百分之百有效
- 【转】LinkedList、ArrayList各自的使用场景分析
- *** Collection <__NSArrayM: 0x7f9fb3c48bc0> was mutated while being enumerated问题
- Android开发中遇到的一些小问题
- (二)ActiveMQ 点对点系统模型
- 线程间 COM实例的传递
- 【poj2774】Long Long Message 后缀数组
- 有关禅道的学习记录
- 模块化与解耦
- (三)ActiveMQ 发布订阅系统模型
- Eclipse 升级ADT的问题
- 事件传播的三个阶段
- 【CSS3】关于box-shadow的扩展半径