一、ActiveMQ安装、配置、启动、可视化界面
1、安装
下载地址:http://activemq.apache.org/download.html
2、配置(conf目录下)
1)用户名密码设置
2)开启jmx监控
activemq.xml中进行如下修改
注:这里的配置不是必须,根据需要自行配置
3、启动
直接运行bin目录下:activemq.bat
4、可视化界面
浏览器中:http://localhost:8161/admin/index.jsp
用户名,密码在:jetty-realm.properties中设置
代码演示:
A、点对点的消息模型,只需要一个消息生成者和消息消费者,下面我们编写代码。
消息生产者:
package com.gcc.activemq.product;
import java.awt.font.TextMeasurer;
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;
import org.apache.activemq.camel.component.ActiveMQComponent;
/**
* 消息生产者(发送者)
* @author gcc
*
* 2018年1月20日
*/
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 = 100;
public static void main(String[] args) {
//连接工厂
ConnectionFactory connectionFactory;
//连接
Connection connection =null;
//会话 接收或发送消息的线程
Session session;
//消息的目的地
Destination destination;
//消息的生产者
MessageProducer messageProducer;
//实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKEURL);
try {
//创建连接
connection = connectionFactory.createConnection();
//开启会话
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//创建消息队列
destination = session.createQueue("xiaochao");
//创建消息生产者
messageProducer = session.createProducer(destination);
//发送消息
sendMessage(session, messageProducer);
} catch (JMSException e) {
e.printStackTrace();
}finally {
if(connection!=null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
/**
* 发送消息
* @param session
* @param messageProducer 消息生产者
* @throws JMSException
*/
private static void sendMessage(Session session, MessageProducer messageProducer) throws JMSException {
for(int i=0;i<JMSProducer.SENDNUM;i++) {
TextMessage message = session.createTextMessage("ActiveMQ 发送消息" +i);
System.out.println("发送消息:Activemq 发送消息" + i);
messageProducer.send(message);
}
}
}
消息消费者:
package com.gcc.activemq.consume;
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 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();
//开启会话
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//创建消息队列
destination = session.createQueue("xiaochao");
//创建消息生产者
messageConsumer = session.createConsumer(destination);
while (true) {
TextMessage textMessage = (TextMessage) messageConsumer.receive(100000);
if(textMessage != null){
System.out.println("收到的消息:" + textMessage.getText());
}else {
break;
}
}
} catch (JMSException e) {
e.printStackTrace();
}finally {
if(connection!=null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}
运行
- 首先,启动ActiveMQ,如何启动ActiveMQ如何启动,请看第二篇博文。在浏览器中输入:http://localhost:8161/admin/,然后开始执行:
-
运行发送者,eclipse控制台输出,如下图:
此时,我们先看一下ActiveMQ服务器,Queues内容如下:
我们可以看到创建了一个名称为HelloWorld的消息队列,队列中有10条消息未被消费,我们也可以通过Browse查看是哪些消息,如下图:
如果这些队列中的消息,被删除,消费者则无法消费。 -
我们继续运行一下消费者,eclipse控制台打印消息,如下:
此时,我们先看一下ActiveMQ服务器,Queues内容如下:
我们可以看到HelloWorld的消息队列发生变化,多一个消息者,队列中的10条消息被消费了,点击Browse查看,已经为空了。
点击Active Consumers,我们可以看到这个消费者的详细信息:
B、主题发布订阅式(Topic)package com.gcc.activemq.consume; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.MessageListener; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; public class TopicConsumer { 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(TopicConsumer.USERNAME, TopicConsumer.PASSWORD, TopicConsumer.BROKEURL); try { //创建连接 connection = connectionFactory.createConnection(); //开启会话 session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); //创建消息队列 destination = session.createQueue("xiaochao"); //创建消息消费者 messageConsumer = session.createConsumer(destination); //采用监听的方式 ,注册监听,自动的去监听里触发消息 messageConsumer.setMessageListener(new Listener()); } catch (JMSException e) { e.printStackTrace(); }finally { if(connection!=null) { try { connection.close(); } catch (JMSException e) { e.printStackTrace(); } } } } } /** * 消息监听 * @author gcc * * 2018年1月20日 */ class Listener implements MessageListener{ 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(); } } }
作者:scgyus
转载请注明出处:http://blog.csdn.net/scgyus/