ActiveMQ学习(windows)

239 阅读2分钟

ActiveMQ学习

认识

Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。

ActiveMQ ActiveMQ官网

简介

Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。

特点

  • 支持Java消息服务(JMS) 1.1 版本
  • Spring Framework
  • 集群 (Clustering)
  • 支持的编程语言包括:C、C++、C#、Delphi、Erlang、Adobe Flash、Haskell、Java、JavaScript、Perl、PHP、Pike、Python和Ruby
  • 协议支持包括:OpenWire、REST、STOMP、WS-Notification、MQTT、XMPP以及AMQP

使用Activemq的使用步骤

  • 下载好的apache-activemq-5.11.1-bin.zip文件解压

  • 进入win64中的文件夹中点击activemq.bat

  • activemq的端口是8161

  • 创建一个java的jar项目

  • 在项目中创建activemq文件夹

  • 把apache-activemq-5.11.1-bin.zip文件中activemq-all-5.11.1.jar复制进去

  • 创建JMSProducer类包路径是com.zichen.activemq

      package com.zichen.activemq;
    
      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;
    
      /**
      * 消息生产者
      * 
      * @author Administrator
      *
      */
      public class JMSProducer {
    
          // 默认连接用户名称
          private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
          // 默认连接密码
          private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
          // 连接地址
          private static final String BROKURL = ActiveMQConnection.DEFAULT_BROKER_URL;
          // 消息数量10
          private static final int SENDNUM = 10;
    
          public static void main(String[] args) {
              // 连接工厂
              ConnectionFactory connectionFactory;
              // 连接
              Connection connection = null;
              // 会话 接收信息和发送信息
              Session session;
              // 消息的目的地
              Destination destination;
              // 消息生产者
              MessageProducer messageProducer;
              // 实例化连接工厂
              connectionFactory = new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD,
                      JMSProducer.BROKURL);
    
              try {
                  // 通过工厂获取连接
                  connection = connectionFactory.createConnection();
                  connection.start();// 启动
                  session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);// 创建session
                  destination = session.createQueue("FirstQueue1");// 创建消息队列
                  messageProducer = session.createProducer(destination);// 创建消息生产者
                  sendMessage(session, messageProducer);// 发送消息
                  session.commit();// 才会发送消息
              } catch (Exception e) {
                  e.printStackTrace();
              } finally {
                  // 释放资源
                  if (connection != null) {
                      try {
                          connection.close();
                      } catch (JMSException e) {
                          e.printStackTrace();
                      }
    
                  }
              }
          }
    
          /**
          * 发送消息
          * 
          * @param session
          * @param messageProducer
          * @throws JMSException
          */
          public static void sendMessage(Session session, MessageProducer messageProducer) throws JMSException {
              for (int i = 0; i < JMSProducer.SENDNUM; i++) {
                  TextMessage message = session.createTextMessage("ActiveMq 发送的消息" + i);
                  System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);
                  messageProducer.send(message);
              }
          }
      }
    
    

    结果

  • 按照如下图所示账号密码是admin

  • 进来的界面

  • Receive的方式

    • Session.AUTO-ACKNOWLEDGE。当客户成功的从receive方法返回的时候,或者从MessageListener.oMessage方法成功返回的时候,会话自动确认客户收到的消息。
    • Session.CLIENT-ACKNOWLEDGE,客户通过消息的acknowledge方法确认消息。需要注意的是,在这种模式中,确认是在会话层上进行:确认一个被消费的消息将自动确认所有已被会话消费的消息。例如,如果一个消息消费者消费了10个消息,然后确认第5个消息,那么所有10个消息都被确认。
    • Session DUPS-ACKNOWLEDGE,该选择只是会话迟钝第确认消息的提交。如果JMS provider失败,那么可能会导致一些重复的消息。如果是重复的消息,那么JMS provider必须把消息头的JMSRedelivered字段设置为true.
  • 创建JMSConsumer(JMS的消费者不常用)

      package com.zichen.activemq;
    
      import javax.jms.Connection;
      import javax.jms.ConnectionFactory;
      import javax.jms.Destination;
      import javax.jms.JMSException;
      import javax.jms.Message;
      import javax.jms.MessageConsumer;
      import javax.jms.Session;
      import javax.jms.TextMessage;
    
      import org.apache.activemq.ActiveMQConnection;
      import org.apache.activemq.ActiveMQConnectionFactory;
    
      /**
      * JMS的消费者
      * @author Administrator
      *
      */
      public class JMSConsumer {
          // 默认连接用户名称
              private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
              // 默认连接密码
              private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
              // 连接地址
              private static final String BROKURL = ActiveMQConnection.DEFAULT_BROKER_URL;
              
              public static void main(String[] args) {
                  // 连接工厂
                  ConnectionFactory connectionFactory;
                  // 连接
                  Connection connection = null;
                  // 会话 接收信息和发送信息
                  Session session;
                  // 消息的目的地
                  Destination destination;
                  //消息消费者
                  MessageConsumer messageConsumer;
                  
                  // 实例化连接工厂
                  connectionFactory = new ActiveMQConnectionFactory(JMSConsumer.USERNAME, JMSConsumer.PASSWORD,
                          JMSConsumer.BROKURL);
                  
                  try {
                      // 通过工厂获取连接
                      connection = connectionFactory.createConnection();
                      connection.start();// 启动
                      session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);// 创建session
                      destination = session.createQueue("FirstQueue1");// 创建消息队列
                      messageConsumer = session.createConsumer(destination);// 创建消息消费者
                      while (true) {
                          TextMessage message = (TextMessage) messageConsumer.receive(100000);
                          if (message!=null) {
                              System.out.println("收到的信息:" + message.getText());
                          }else {
                              break;
                          }
                          
                      }
                  } catch (Exception e) {
                      e.printStackTrace();
                  } finally {
                      // 释放资源
                      if (connection != null) {
                          try {
                              connection.close();
                          } catch (JMSException e) {
                              e.printStackTrace();
                          }
    
                      }
                  }
              }
      }
    
    

    结果

  • Listener的方式(常用的方式)

    • 创建MyListener类实现接口MessageListener

      /**
      * 消息监听
      * @author Administrator
      *
      */
      public class MyListener implements MessageListener {
      
          @Override
          public void onMessage(Message message) {
              try {
                  System.out.println("使用listener收到的信息:" + ((TextMessage)message).getText());
              } catch (JMSException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
          }
      }
      
    • 创建JMSConsumer2

      package com.zichen.activemq;
      
      import javax.jms.Connection;
      import javax.jms.ConnectionFactory;
      import javax.jms.Destination;
      import javax.jms.JMSException;
      import javax.jms.MessageConsumer;
      import javax.jms.Session;
      import javax.jms.TextMessage;
      
      import org.apache.activemq.ActiveMQConnection;
      import org.apache.activemq.ActiveMQConnectionFactory;
      
      /**
      * JMS的消费者
      * @author Administrator
      *
      */
      public class JMSConsumer2 {
          // 默认连接用户名称
              private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
              // 默认连接密码
              private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
              // 连接地址
              private static final String BROKURL = ActiveMQConnection.DEFAULT_BROKER_URL;
              
              public static void main(String[] args) {
                  // 连接工厂
                  ConnectionFactory connectionFactory;
                  // 连接
                  Connection connection = null;
                  // 会话 接收信息和发送信息
                  Session session;
                  // 消息的目的地
                  Destination destination;
                  //消息消费者
                  MessageConsumer messageConsumer;
                  
                  // 实例化连接工厂
                  connectionFactory = new ActiveMQConnectionFactory(JMSConsumer2.USERNAME, JMSConsumer2.PASSWORD,
                          JMSConsumer2.BROKURL);
                  
                  try {
                      // 通过工厂获取连接
                      connection = connectionFactory.createConnection();
                      connection.start();// 启动
                      session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);// 创建session
                      destination = session.createQueue("FirstQueue1");// 创建消息队列
                      messageConsumer = session.createConsumer(destination);// 创建消息消费者
                      messageConsumer.setMessageListener(new MyListener());//注册监听
                  } catch (Exception e) {
                      e.printStackTrace();
                  } finally {
                      // 释放资源
                      if (connection != null) {
                          try {
                              connection.close();
                          } catch (JMSException e) {
                              e.printStackTrace();
                          }
      
                      }
                  }
              }
      }
      

activeMq的发布和订阅模式(一对多)的形式

项目的结构

使用的前后是要先订阅才能接收到,相当于订报纸一样,需要先订阅才接收。

  • 生产者

      package com.zichen.activemq2;
    
      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;
    
      /**
      * 消息生产者-发布模式
      * 
      * @author Administrator
      *
      */
      public class JMSProducer {
    
          // 默认连接用户名称
          private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
          // 默认连接密码
          private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
          // 连接地址
          private static final String BROKURL = ActiveMQConnection.DEFAULT_BROKER_URL;
          // 消息数量10
          private static final int SENDNUM = 10;
    
          public static void main(String[] args) {
              // 连接工厂
              ConnectionFactory connectionFactory;
              // 连接
              Connection connection = null;
              // 会话 接收信息和发送信息
              Session session;
              // 消息的目的地
              Destination destination;
              // 消息生产者
              MessageProducer messageProducer;
              // 实例化连接工厂
              connectionFactory = new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD,
                      JMSProducer.BROKURL);
              try {
                  // 通过工厂获取连接
                  connection = connectionFactory.createConnection();
                  connection.start();// 启动
                  session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);// 创建session
                  //destination = session.createQueue("FirstQueue1");// 创建消息队列
                  destination =session.createTopic("FirstTopic1");
                  messageProducer = session.createProducer(destination);// 创建消息生产者
                  sendMessage(session, messageProducer);// 发送消息
                  session.commit();// 才会发送消息
              } catch (Exception e) {
                  e.printStackTrace();
              } finally {
                  // 释放资源
                  if (connection != null) {
                      try {
                          connection.close();
                      } catch (JMSException e) {
                          e.printStackTrace();
                      }
    
                  }
              }
          }
    
          /**
          * 发送消息
          * 
          * @param session
          * @param messageProducer
          * @throws JMSException
          */
          public static void sendMessage(Session session, MessageProducer messageProducer) throws JMSException {
              for (int i = 0; i < JMSProducer.SENDNUM; i++) {
                  TextMessage message = session.createTextMessage("ActiveMq 发送的消息" + i);
                  System.out.println("发送消息:" + "ActiveMq 发布的消息" + i);
                  messageProducer.send(message);
              }
          }
      }
    
  • 消费者 创建多个即可,只是MyListener1的监听名称需要弄

    注:只是MyListener1的监听名称需要弄

      /**
      * 消息监听
      * @author Administrator
      *
      */
      public class MyListener1 implements MessageListener {
    
          @Override
          public void onMessage(Message message) {
              try {
                  System.out.println("使用listener1收到的信息:" + ((TextMessage)message).getText());
              } catch (JMSException e) {
                  e.printStackTrace();
              }
          }
      }
    
    
      package com.zichen.activemq2;
    
      import javax.jms.Connection;
      import javax.jms.ConnectionFactory;
      import javax.jms.Destination;
      import javax.jms.JMSException;
      import javax.jms.MessageConsumer;
      import javax.jms.Session;
      import javax.jms.TextMessage;
    
      import org.apache.activemq.ActiveMQConnection;
      import org.apache.activemq.ActiveMQConnectionFactory;
    
      /**
      * JMS的消费者 订阅者1
      * @author Administrator
      *
      */
      public class JMSConsumer1 {
          // 默认连接用户名称
              private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
              // 默认连接密码
              private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
              // 连接地址
              private static final String BROKURL = ActiveMQConnection.DEFAULT_BROKER_URL;
              
              public static void main(String[] args) {
                  // 连接工厂
                  ConnectionFactory connectionFactory;
                  // 连接
                  Connection connection = null;
                  // 会话 接收信息和发送信息
                  Session session;
                  // 消息的目的地
                  Destination destination;
                  //消息消费者
                  MessageConsumer messageConsumer;
                  
                  // 实例化连接工厂
                  connectionFactory = new ActiveMQConnectionFactory(JMSConsumer1.USERNAME, JMSConsumer1.PASSWORD,
                          JMSConsumer1.BROKURL);
                  
                  try {
                      // 通过工厂获取连接
                      connection = connectionFactory.createConnection();
                      connection.start();// 启动
                      session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);// 创建session
                      //destination = session.createQueue("FirstQueue1");// 创建消息队列
                      destination =session.createTopic("FirstTopic1");
                      messageConsumer = session.createConsumer(destination);// 创建消息消费者
                      messageConsumer.setMessageListener(new MyListener1());//注册监听
                  } catch (Exception e) {
                      e.printStackTrace();
                  } 
              }
      }
    
    

😀😀😀😀😀😀😀😀😀😀