ActiveMQ入门实例

最近想看一些MQ的资料,本来想看下RocketMQ的,可惜资料有点少,得下次了,这次就选择ActiveMQ开刀了!=  =

一、下载ActiveMQ

去官方网站下载:http://activemq.apache.org/

二、运行

解压缩apache-activemq-5.14.4-bin.zip,然后双击apache-activemq-5.14.4\bin\win64\activemq.bat运行ActiveMQ程序。
启动ActiveMQ以后,登陆:http://localhost:8161/admin

三、创建项目

将刚解压的ActiveMQ文件夹中的activemq-all-5.14.4.jar 导入工程,结构图如下:


接下来就是各个代码了

先看消息点对点模式,在com.zz.activemq下

Producer.java

package com.zz.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 Producer {

	private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
	private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
	private static final String BROKENURL = ActiveMQConnection.DEFAULT_BROKER_URL; 
	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(USERNAME, PASSWORD, BROKENURL);
		
		try {
			connection = connectionFactory.createConnection();
			//启动连接
			connection.start();
			//创建session
			session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
			//创建消息队列
			destination = session.createQueue("第一个消息队列");
			//创建消息生产者
			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 < SENDNUM; i++) {
			TextMessage message = session.createTextMessage("ActiveMQ 发送的消息" + i);
			System.out.println("发送消息-->" + "ActiveMQ 发送的消息" + i);
			messageProducer.send(message);
		}
	}
}

Consumer.java

package com.zz.activemq;

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 Consumer {
	private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
	private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
	private static final String BROKENURL = ActiveMQConnection.DEFAULT_BROKER_URL;

	public static void main(String[] args) {
		// 连接工厂
		ConnectionFactory connectionFactory;
		// 连接
		Connection connection = null;
		// 会话 接受或者发送消息的线程
		Session session;
		// 消息目的地
		Destination destination;
		// 消息消费者
		MessageConsumer messageConsumer;

		connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKENURL);

		try {
			connection = connectionFactory.createConnection();
			connection.start();
			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			destination = session.createQueue("第一个消息队列");
			messageConsumer = session.createConsumer(destination);
			//注册消息监听
			messageConsumer.setMessageListener(new Listener());
			
		} catch (Exception exception) {
			exception.printStackTrace();
		}

	}
}
Listener.java

package com.zz.activemq;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**
 * 消息监听
 * @author Hacfqx
 *
 */
public class Listener implements MessageListener{

	@Override
	public void onMessage(Message arg0) {
		try {
			System.out.println("收到的消息-->" + ((TextMessage)arg0).getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
	
}
代码写完了,挺简单的。

运行Producer.java,控制台打印出如下信息:

 INFO | Successfully connected to tcp://localhost:61616
发送消息-->ActiveMQ 发送的消息0
发送消息-->ActiveMQ 发送的消息1
发送消息-->ActiveMQ 发送的消息2
发送消息-->ActiveMQ 发送的消息3
发送消息-->ActiveMQ 发送的消息4
发送消息-->ActiveMQ 发送的消息5
发送消息-->ActiveMQ 发送的消息6
发送消息-->ActiveMQ 发送的消息7
发送消息-->ActiveMQ 发送的消息8
发送消息-->ActiveMQ 发送的消息9


这时候去ActiveMQ控制台瞄一眼



然后运行consumer.java,结果如下

 INFO | Successfully connected to tcp://localhost:61616
收到的消息-->ActiveMQ 发送的消息0
收到的消息-->ActiveMQ 发送的消息1
收到的消息-->ActiveMQ 发送的消息2
收到的消息-->ActiveMQ 发送的消息3
收到的消息-->ActiveMQ 发送的消息4
收到的消息-->ActiveMQ 发送的消息5
收到的消息-->ActiveMQ 发送的消息6
收到的消息-->ActiveMQ 发送的消息7
收到的消息-->ActiveMQ 发送的消息8
收到的消息-->ActiveMQ 发送的消息9

刷新继续瞄一眼ActiveMQ控制台


很明显,消息被消费了。

接下来是订阅发布模式

其实代码差不多主要区别在创建消息队列的时候,点对点是createQueue,订阅发布是createTopic

Producer.java

package com.zz.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;

//消息订阅
public class Producer {

	private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
	private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
	private static final String BROKENURL = ActiveMQConnection.DEFAULT_BROKER_URL; 
	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(USERNAME, PASSWORD, BROKENURL);
		
		try {
			connection = connectionFactory.createConnection();
			//启动连接
			connection.start();
			//创建session
			session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
			//创建消息队列
			destination = session.createTopic("第一个Topic");
			//创建消息生产者
			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();
				}
			}
		}
		
	}
	
	public static void sendMessage(Session session, MessageProducer messageProducer) throws JMSException{
		for (int i = 0; i < SENDNUM; i++) {
			TextMessage message = session.createTextMessage("ActiveMQ 发布的消息" + i);
			System.out.println("发送的消息-->" + "ActiveMQ 发布的消息" + i);
			messageProducer.send(message);
		}
	}
}
Consumer.java 这个是订阅者,可以多复制粘贴几份进行测试,目前我只做两个订阅者

package com.zz.activemq2;

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;

/**
 * 消息订阅者1
 * @author Hacfqx
 *
 */
public class Consumer1 {
	private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
	private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
	private static final String BROKENURL = ActiveMQConnection.DEFAULT_BROKER_URL;

	public static void main(String[] args) {
		// 连接工厂
		ConnectionFactory connectionFactory;
		// 连接
		Connection connection = null;
		// 会话 接受或者发送消息的线程
		Session session;
		// 消息目的地
		Destination destination;
		// 消息消费者
		MessageConsumer messageConsumer;

		connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKENURL);

		try {
			connection = connectionFactory.createConnection();
			connection.start();
			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			destination = session.createTopic("第一个Topic");
			messageConsumer = session.createConsumer(destination);
			//注册消息监听
			messageConsumer.setMessageListener(new Listener1());
			
		} catch (Exception exception) {
			exception.printStackTrace();
		}

	}
}
Listener.java

package com.zz.activemq2;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**
 * 消息监听 订阅者1
 * @author Hacfqx
 *
 */
public class Listener1 implements MessageListener{

	@Override
	public void onMessage(Message arg0) {
		try {
			System.out.println("订阅者1的消息-->" + ((TextMessage)arg0).getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
	
}
其他不多说,先运行,这次我先把两个Consumer给运行起来,这时候在ActiveMQ控制台Topics栏会出现一个名叫做“第一个Topic”的订阅,订阅者2个,这时候启动Producer.java产生十条订阅消息。这时候会发现控制台打印除日志,和ActiveMQ控制台会出现出队消息数20条。没毛病!

就到这里结束吧,下次找个时间查查RocketMQ的资料给补上,不然心里难受。 起床抽根烟思考思考人生,睡觉了。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值