ActiveMQ 开发包下载及运行环境搭建
<<activemq-parent-5.11.1-source-release.zip>>
<<apache-activemq-5.11.1-bin.zip>>
网页地址
主页:http://activemq.apache.org/ 目前最新版本:5.11.1 开发包及源码下载地址:http://activemq.apache.org/activemq-5111-release.html ActiveMQ 服务启动地址:http://127.0.0.1:8161/admin/ 用户名/密码 admin/admin |
进入bin目录启动对应操作系统的程序
进入后台
用户名和密码都是 admin
ActiveMQ 点对点消息实现
直接 Receive 方式
Session.AUTO_ACKNOWLEDGE。当客户成功的从receive方法返回的时候,或者从MessageListener.onMessage 方法成功返回的时候,会话自动确认客户收到的消息。 Session.CLIENT_ACKNOWLEDGE。 客户通过消息的 acknowledge 方法确认消息。需要注意的是,在这种模 式中,确认是在会话层上进行:确认一个被消费的消息将自动确认所有已被会话消 费的消息。例如,如果一 个消息消费者消费了 10 个消息,然后确认第 5 个消息,那么所有 10 个消息都被确认。 Session.DUPS_ACKNOWLEDGE。 该选择只是会话迟钝第确认消息的提交。如果 JMS provider 失败,那么可 能会导致一些重复的消息。如果是重复的消息,那么 JMS provider 必须把消息头的 JMSRedelivered 字段设置 为 true。 |
消息的发送者 JMSProducer
默认发送地址:failover://tcp://localhost:61616
public class JMSProducer {
//定义配置文件 private static final String USERNAME=ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名 private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码 private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址 private static final int SENDNUM=10; // 发送的消息数量
public static void main(String[] args) {
ConnectionFactory connectionFactory; // 定义连接工厂,可以生产connection Connection connection = null; // 定义连接 Session session; // 定义会话 接受或者发送消息的线程 Destination destination; // 定义消息的目的地 MessageProducer messageProducer; // 定义消息发送者
// 实例化连接工厂 connectionFactory=new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD, JMSProducer.BROKEURL);
try { //从消息工厂中获取连接 connection=connectionFactory.createConnection(); // 通过连接工厂获取连接 connection.start(); // 启动连接 // 创建Session,createSession(是否使用事务连接,消息确认的方式) session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); destination=session.createQueue("FirstQueue1"); // 创建消息队列,返回一个目的地 messageProducer=session.createProducer(destination); // 创建消息发送者,传入目的地 //调用方法,使用消息发送者,发送消息到session sendMessage(session, messageProducer); // 发送消息 //session事务提交 session.commit(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ //关闭Connection if(connection!=null){ try { connection.close(); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
/** * 发送消息 * @param session * @param messageProducer * @throws Exception */ public static void sendMessage(Session session,MessageProducer messageProducer)throws Exception{ //JMSProducer.SENDNUM 消息生产者的数量 for(int i=0;i<JMSProducer.SENDNUM;i++){ //创建要发送的消息 TextMessage message=session.createTextMessage("ActiveMQ 发送的消息"+i); //控制台打印 System.out.println("发送消息:"+"ActiveMQ 发送的消息"+i); //使用messageProducer发送消息 messageProducer.send(message); } } } |
消息的消费者 JMSConsumer(一直在监听,搜索消息)
private static final String USERNAME=ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名 private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码 private static final String BROKEURL=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.BROKEURL);
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){ //receive(100000)中为毫秒值,每100000毫秒接收一次消息 TextMessage textMessage=(TextMessage)messageConsumer.receive(100000); if(textMessage!=null){ //打印接收到的消息 System.out.println("收到的消息:"+textMessage.getText()); }else{ break; } } } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
接收消息的第二种方式,使用监听(常用的)
使用 Listener 监听方式
创建一个Listener类
/** * 消息监听 * @author Administrator * */ public class Listener implements MessageListener{ @Override public void onMessage(Message message) { // TODO Auto-generated method stub try { System.out.println("收到的消息:"+((TextMessage)message).getText()); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
每次接收到消息都会被监听到
消息消费者 JMSConsumer
ActiveMQ 发布-订阅消息模式实现(一对多实现)
发布-订阅消息模式实现
一个发布者多个订阅者
消息发布者 JMSProducer
消息订阅者1 JMSConsumer
订阅者1的监听
消息订阅者1 JMSConsumer 1(同样方法创建消息订阅者)
订阅者2的监听
运行必须先订阅再发布(只有订阅之后才可以收到消息)
先运行订阅者1,2,再运行发布者