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(); } } }
😀😀😀😀😀😀😀😀😀😀