AvtiveMQ Demo(简单demo,介绍详细适合初学者)

一、安装启动参考:
http://blog.sina.com.cn/s/blog_a459dcf501017oml.html

二、注意事项
   1.关于API方法中参数的具体含义可参考java EE 6 API文档

   2.JMS1.0.2 规范中定义了两种消息传递域:点对点(PTP)消息传递域和发布/订阅消息传递域。

     点对点消息传递域的特点如下:
       • 每个消息只能有一个消费者。
       • 消息的生产者和消费者之间没有时间上的相关性。无论消费者在生产者发送消息的时候是否处于运行状态,它都可以提取消息。

     发布/订阅消息传递域的特点如下:
       • 每个消息可以有多个消费者。
       • 生产者和消费者之间有时间上的相关性。订阅一个主题的消费者只能消费自它订阅之后发布的消息。JMS 规范允许客户创建持久订阅,这在一定程度上放松了时间上的相关性要求。持久订阅允许消费者消费它在未处于激活状态时发送的消息。

     在点对点消息传递域中,目的地被成为队列(queue);在发布/订阅消息传递
域中,目的地被成为主题(topic)。

   3.topic时先调用FirstReceiver类再调用FirstSender类,queue时无先后顺序(看懂了注意事项第二条这条可滤去)。

三、java代码

1.FirstReceiver类
package com.maxLv.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;

public class FirstReceiver {
    public static void main(String[] args){        
        // 连接工厂,JMS 用它创建连接
        ConnectionFactory connectionFactory;       
        // JMS 客户端到 JMS Provider 的连接
        Connection connection = null;      
        // 一个发送消息的线程
        Session session;      
        // 消息的目的地
        Destination destination;
        // 消息接受者
        MessageConsumer messageConsumer;
        // 构造函数传入用户名、密码、brokerURL进行初始化连接
        connectionFactory = new ActiveMQConnectionFactory(
                ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD,
                "tcp://localhost:61616");
        
        try {
            // 构造从工厂得到连接对象
            connection = connectionFactory.createConnection();
            // 启动
            connection.start();
            // 获取连接操作{非事务性会话时(Boolean.FALSE)消息何时被确认由AUTO_ACKNOWLEDGE、CLIENT_ACKNOWLEDGE、DUPS_ACKNOWLEDGE三种应答模式决定}
            session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
            // 获取session注意参数值First-Queue(First-Topic)是一个服务器的queue(topic),须在ActiveMQ的console配置
            destination = session.createQueue("First-Queue");
            // destination = session.createTopic("First-Topic");
            messageConsumer = session.createConsumer(destination);
            while (true) {
                // 设置接受者接受消息的时间(500s)
                TextMessage textMessage = (TextMessage) messageConsumer.receive(500000);
                if (null != textMessage) {
                    System.out.println("Message received:" + textMessage.getText());
                }else {
                    break;
                }
            }
        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            if (null != connection) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }
    } 
}

2.FirstSender类
package com.maxLv.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;

public class FirstSender {
    private static final int SEND_NUMBER = 20;
    
    //发送消息
    private static void sendMessage(Session session,MessageProducer messageProducer) 
            throws JMSException{
        int times = 1;
        while (times <= SEND_NUMBER) { 
            TextMessage textMessage = session.createTextMessage("The Message Of" +" "+ times);           
            System.out.println("Message Send:The ActiveMQ Message Of" +" "+ times);
            messageProducer.send(textMessage);
            times ++;
        }
    }
    
    public static void main(String[] args){
        // ConnectionFactory :连接工厂,JMS 用它创建连接
        ConnectionFactory connectionFactory;
        // Connection :JMS 客户端到JMS Provider 的连接
        Connection connection = null;
        // Session: 一个发送或接收消息的线程
        Session session;
        // Destination :消息的目的地
        Destination destination;
        // 消息发送者
        MessageProducer messageProducer;
        // 构造函数传入用户名、密码、brokerURL进行初始化连接
        connectionFactory = new ActiveMQConnectionFactory(
                ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD,
                "tcp://localhost:61616");
        try {
            // 构造从工厂得到连接
            connection = connectionFactory.createConnection();
            // 启动
            connection.start();
            // 获取连接操作{事务性会话时(Boolean.TRUE)消息自动确认}
            session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
            // 获取session注意参数值First-Queue(First-Topic)是一个服务器的queue(topic),须在ActiveMQ的console配置
            destination = session.createQueue("First-Queue");
            // destination = session.createTopic("First-Topic");
            messageProducer = session.createProducer(destination);
            // 发送消息
            sendMessage(session, messageProducer);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != connection) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


猜你喜欢

转载自lv-max.iteye.com/blog/2186070