ActiveMQ安装配置 和 使用简例
JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,ActiveMQ而是这个规范的一个具体实现。
JMS的队列消息传递过程如下图:
JMS的主题消息传递过程如下图:
ActiveMQ下载与部署。
1、 下载
到官网下载最新版本,有windows版本和linux版本的。
http://activemq.apache.org/download.html
windows版本:apache-activemq-5.10-20140603.133406-78-bin.zip
linux版本:apache-activemq-5.10-20140603.133406-78-bin.tar.gz
2、 部署
A、 windows下部署
ActiveMQ部署其实很简单,和所有Java一样,要跑java程序就必须先安装JDK并配置好环境变量,这个很简单。
然后解压下载的apache-activemq-5.10-20140603.133406-78-bin.zip压缩包到一个目录,得到解压后的目录结构如下图:
进入bin目录,发现有win32和win64两个文件夹,这2个文件夹分别对应windows32位和windows64位操作系统的启动脚本。
我的实验环境是windowsXP,就进入win32目录,会看到如下目录结构。
其中activemq.bat便是启动脚本,双击启动。
ActiveMQ默认启动到8161端口,启动完了后在浏览器地址栏输入:http://localhost:8161/admin要求输入用户名密码,默认用户名密码为admin、admin,这个用户名密码是在conf/users.properties中配置的。输入用户名密码后便可看到如下图的ActiveMQ控制台界面了。
ActiveMQ默认绑定本地端口61616,如果一切顺利,启动ActiveMQ成功后,可以执行命令:
- netstat -an|find "61616"
查看到端口61616的状态如图:
表明ActiveMQ消息服务器端启动已经成功,已经在端口61616收发消息。
(3)下面就可以使用ActiveMQ在自己的Java程序中编写代码收发消息。以两个java应用程序为例,一个单独的Sender.java作为消息的发送方,另外一个Receiver.java作为消息的接收方。
Sender.java
- import javax.jms.Connection;
- import javax.jms.ConnectionFactory;
- import javax.jms.DeliveryMode;
- 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 Sender {
- //标明一个消息队列。
- private static final String MESSAGE_QUEUE="zhangphil";
- //默认的ActiveMQ服务器端绑定的端口。
- private static final int PORT=61616;
- //发送10条消息。
- private static final int COUNT = 10;
- 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 producer;
- // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
- connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:"+PORT);
- try {
- // 构造从工厂得到连接对象
- connection = connectionFactory.createConnection();
- // 启动
- connection.start();
- // 获取操作连接
- session = connection.createSession(Boolean.TRUE.booleanValue(), Session.AUTO_ACKNOWLEDGE);
- // 获取session注意参数值 zhangphil 是一个服务器的queue,须在在ActiveMq的console配置
- destination = session.createQueue(MESSAGE_QUEUE);
- // 得到消息生成者,发送者
- producer = session.createProducer(destination);
- // 设置不持久化
- producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
- // 发送消息。
- sendMessage(session, producer);
- session.commit();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- if (null != connection)
- connection.close();
- } catch (Throwable ignore) {
- }
- }
- }
- public static void sendMessage(Session session, MessageProducer producer){
- for (int i = 0; i <COUNT; i++) {
- TextMessage message = null;
- try {
- message = session.createTextMessage("zhangphil message "+i);
- } catch (JMSException e) {
- e.printStackTrace();
- }
- // 发送消息到目的地方
- try {
- producer.send(message);
- System.out.println("发送消息:"+message.getText());
- } catch (JMSException e) {
- e.printStackTrace();
- }
- }
- }
- }
Receiver.java
- import javax.jms.Connection;
- import javax.jms.ConnectionFactory;
- import javax.jms.Destination;
- import javax.jms.MessageConsumer;
- import javax.jms.Session;
- import javax.jms.TextMessage;
- import org.apache.activemq.ActiveMQConnection;
- import org.apache.activemq.ActiveMQConnectionFactory;
- public class Receiver {
- private static final String MESSAGE_QUEUE="zhangphil";
- private final static int PORT=61616;
- public static void main(String[] args) {
- // ConnectionFactory :连接工厂,JMS 用它创建连接
- ConnectionFactory connectionFactory;
- // Connection :JMS 客户端到JMS Provider 的连接
- Connection connection = null;
- // Session: 一个发送或接收消息的线程
- Session session;
- // Destination :消息的目的地;消息发送给谁.
- Destination destination;
- // 消息接收者
- MessageConsumer consumer;
- connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:"+PORT);
- try {
- // 构造从工厂得到连接对象
- connection = connectionFactory.createConnection();
- // 启动
- connection.start();
- // 获取操作连接
- session = connection.createSession(Boolean.FALSE.booleanValue(), Session.AUTO_ACKNOWLEDGE);
- // 获取session注意参数值 zhangphil 是一个服务器的queue,只接受相同message queue字段的消息。
- destination = session.createQueue(MESSAGE_QUEUE);
- consumer = session.createConsumer(destination);
- while (true) {
- TextMessage message = (TextMessage) consumer.receive(1000);
- if (null != message) {
- System.out.println("收到消息: " + message.getText());
- } else {
- //如果不break,receiver将轮询接收消息。
- //break,Receiver.java退出。
- //break;
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- if (null != connection)
- connection.close();
- } catch (Throwable ignore) {
- }
- }
- }
- }
编译上述两个java文件,需要导入ActiveMQ的jar库包。将(2)中的…\apache-activemq-5.12.0-bin\apache-activemq-5.12.0\activemq-all-5.12.0.jar作为库包导入进来。
ActiveMQ的基本配置
ActiveMQ默认的系统配置网页是: http://localhost:8161/admin/
用户名和密码默认均是: admin