ActiveMQ入门

  • 准备好ActiveMQ
  1. 官网下载ActiveMQ: http://activemq.apache.org/download.html
  2. 下载之后,解压缩到当前目录,进入到解压缩后的目录中/bin/,执行activemq start 命令启动ActiveMQ,打开浏览器,输入http://localhost:8161/admin/ 进入ActiveMQ管理页面,默认有两个登录用户admin user 密码账号一样,如需修改,可以到ActiveMQ目录下的conf/ 目录下,打开jetty-realm.properties文件设置。

ActiveMQ默认的端口是8161,至此,ActiveMQ安装好。

 

  • 设置Tomcat容器中队列相关参数

  进入Tomcat安装目录,进入conf/ 目录打开context.xml,在<Context>标签中添加两个<Resource>标签,一个是ActiveMQ消息队列的连接工厂,一个是消息队列的队列名称

<Resource name="queue/connectionFactory"    

                auth="Container"    

                type="org.apache.activemq.ActiveMQConnectionFactory"  

                description="JMS Connection Factory"  

                factory="org.apache.activemq.jndi.JNDIReferenceFactory"  

                brokerURL="tcp://localhost:61616"  

                brokerName="LocalActiveMQBroker" />  

<Resource name="queue/queue0"    

                auth="Container"    

                type="org.apache.activemq.command.ActiveMQQueue"  

                description="My Queue"  

                factory="org.apache.activemq.jndi.JNDIReferenceFactory"  

                physicalName="TomcatQueue" />

配置完毕,关闭结束。

 

JNDI(Java Naming and Directory Interface)是一个标准规范,类似于JDBC,JMS等规范,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现,因此Tomcat就实现了JNDI 规范。

上面的操作就是配置Tomcat的JNDI。

 

  • 开发消息队列的web应用,使用Tomcat运行。

开发IDE:Eclipse,

  1. 设置Eclipse中的服务器为本地自己安装的Tomcat,也就是上面配置了Resource标签的那个Tomcat。步骤如下图

  1. 创建Maven工程,选择archetypes为webapp,项目名称为ActiveMQDemo,打开pom.xml文件添加ActiveMQ的依赖:

    <dependency>

        <groupId>org.apache.activemq</groupId>

        <artifactId>activemq-all</artifactId>

        <version>5.15.8</version>

   </dependency>

创建消息生产者servlet类:

package com.test.activemq;

import java.io.IOException;
import java.io.PrintWriter;

import javax.jms.DeliveryMode;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Send")
public class Send extends HttpServlet {
    
    private static final long serialVersionUID = 1L;
    
    public Send() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        try{
            // get the initial context
            InitialContext context = new InitialContext();
            
            // lookup the queue object
            Queue queue = (Queue) context.lookup("java:comp/env/queue/queue0");
            
            // lookup the queue connection factory
            QueueConnectionFactory conFactory = (QueueConnectionFactory) context.lookup("java:comp/env/queue/connectionFactory");
            
            // create a connection
            QueueConnection queueConn = conFactory.createQueueConnection();
            
            // create a queue session
            QueueSession queSession = queueConn.createQueueSession(false,Session.DUPS_OK_ACKNOWLEDGE);
            
            // create a queue sender
            QueueSender queSender = queSession.createSender(queue);
            queSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

            // create a simple message to say "Hello World"
            TextMessage message = queSession.createTextMessage("Hello World");

            // send the message
            queSender.send(message);

            // print what we did
            out.write("Message Send: " + message.getText());

            // close the queue connection
            queueConn.close();
        } catch(Exception e){
            e.printStackTrace();
        }
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
    }
    
}
 

创建消息消费者servlet类

package com.test.activemq;

import java.io.IOException;
import java.io.PrintWriter;

import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Receive")
public class Receive extends HttpServlet {

    public Receive() {
        super();
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();

        try {
            // get the initial context
            InitialContext context = new InitialContext();

            // lookup the queue object
            Queue queue = (Queue) context.lookup("java:comp/env/queue/queue0");

            // lookup the queue connection factory
            QueueConnectionFactory conFactory = (QueueConnectionFactory) context
                    .lookup("java:comp/env/queue/connectionFactory");

            // create a queue connection
            QueueConnection queConn = conFactory.createQueueConnection();

            // create a queue session
            QueueSession queSession = queConn.createQueueSession(false,
                    Session.AUTO_ACKNOWLEDGE);

            // create a queue receiver
            QueueReceiver queReceiver = queSession.createReceiver(queue);

            // start the connection
            queConn.start();

            // receive a message
            TextMessage message = (TextMessage) queReceiver.receive();

            // print the message
            out.write("Message Received: " + message.getText());

            // close the queue connection
            queConn.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
    }
}
 

  1. 将项目部署到Tomcat

File-->New-->Other,搜索Server,然后点next,直到下面弹框出现,按步骤操作最后finish,

点击Windows-->Show View-->Other,搜索Server,出现Server工作台,选择创建好的TomcatServer,右键启动。http://localhost/ActiveMQDemo 访问到这个项目的首页,http://localhost/ActiveMQDemo/Send生成消息到ActiveMQ,http://localhost/ActiveMQDemo/Receive获取一个ActiveMQ消息。

 

2019-3-15更新

上面的开发方式搞得太负杂了,下面使用Idea 做了一个SpringBoot的Demo

初始化一个SpringBoot项目,在项目中的pom.xml文件中添加以下依赖

<dependency>
   <groupId>org.apache.activemq</groupId>
   <artifactId>activemq-all</artifactId>
   <version>5.15.8</version>
</dependency>
<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
</dependency>

创建消息生产者:

package com.example.activemqdemo;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;

import javax.jms.*;

/**
 * Created with IDEA
 * author : charberming
 * Date : 2019/3/25 0025
 * Time : 上午 11:22
 * 消息队列生产者
 */
public class ActiveMQProducer {
    @Test
    public void testProduceMQ() throws Exception {
        // 连接工厂
        // 使用默认用户名、密码、路径
        // 路径 tcp://host:61616
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        // 获取一个连接
        Connection connection = connectionFactory.createConnection();
        // 建立会话  设置状态true开启事务
        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        // 创建队列或者话题对象
        Queue queue = session.createQueue("HelloWorld");
//        Topic helloTopic = session.createTopic("HelloTopic");

        // 创建生产者 或者 消费者
        MessageProducer producer = session.createProducer(queue);

        // 发送消息
        for (int i = 0; i < 10; i++) {
            producer.send(session.createTextMessage("你好,activeMQ:" + i));
        }
        // 提交事务操作
        session.commit();

    }
}

创建消费者:

package com.example.activemqdemo;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;

import javax.jms.*;

/**
 * Created with IDEA
 * author : charberming
 * Date : 2019/3/25 0025
 * Time : 上午 11:31
 * 消费者
 */
public class ActiveMQConsumer {
    @Test
    // 直接消费
    public void testCosumeMQ() throws Exception {
        // 连接工厂
        // 使用默认用户名、密码、路径
        // 路径 tcp://host:61616
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        // 获取一个连接
        Connection connection = connectionFactory.createConnection();
        // 开启连接
        connection.start();
        // 建立会话
        // 第一个参数,是否使用事务,如果设置true,操作消息队列后,必须使用 session.commit();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建队列或者话题对象
        Queue queue = session.createQueue("HelloWorld");
        // 创建消费者
        MessageConsumer messageConsumer = session.createConsumer(queue);

        while (true) {
            TextMessage message = (TextMessage) messageConsumer.receive(10000);/*超时时间 10000*/
            if (message != null) {
                System.out.println(message.getText());
            } else {
                break;
            }
        }
    }

    @Test
    // 使用监听器消费
    public void testCosumeMQ2() throws Exception {
        // 连接工厂
        // 使用默认用户名、密码、路径
        // 路径 tcp://host:61616
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        // 获取一个连接
        Connection connection = connectionFactory.createConnection();
        // 开启连接
        connection.start();
        // 建立会话
        // 第一个参数,是否使用事务,如果设置true,操作消息队列后,必须使用 session.commit();
        Session session = connection.createSession(false,
                Session.AUTO_ACKNOWLEDGE);
        // 创建队列或者话题对象
        Queue queue = session.createQueue("HelloWorld");
        // 创建消费者
        MessageConsumer messageConsumer = session.createConsumer(queue);

        messageConsumer.setMessageListener(new MessageListener() {
            // 每次接收消息,自动调用 onMessage
            @Override
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println(textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });

        while (true) {
            // 不能让junit线程死掉
        }
    }

}

这个demo比较简单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值