(二)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. 切记一条消息只能被一个消费者消费。


1 0
原创粉丝点击