activemq安装:下载activemq,解压出来即可用
activemq启动:apache-activemq-5.13.4\bin\win64\activemq.bat 双击启动,32位系统运行win32下面的
下载地址:http://activemq.apache.org/download-archives.html 选择自己需要的版本,有Linux、Windows等版本(注:5.14及以上版本需要jdk1.8)
这里使用的是Windows版本apache-activemq-5.13.4,启动成功后访问 localhost:8161 会显示activemq主页
Java代码:
自定义消息对象:
package com.activemq;
import java.io.Serializable;
/**
* 自定义消息对象
* @author pure
*/
public class MqMessage implements Serializable{
private static final long serialVersionUID = 3223729388758350932L;
private String name;
private String text;
private String url;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
package com.activemq;
import java.util.Date;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 队列消息接收者
* @author pure
*
*/
public class ActivemqReceiver extends Thread{
private String queueName;
public ActivemqReceiver(String queueName){
this.queueName=queueName;
}
@Override
public void run() {
//ConnectionFactory connectionFactory;
// Connection :JMS 客户端到JMS Provider 的连接
Connection connection = null;
// Session: 一个发送或接收消息的线程
Session session;
// Destination :消息的目的地;消息发送给谁.
Destination destination;
// 消费者,消息接收者
MessageConsumer consumer;
//connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://127.0.0.1:61616");
ActiveMQConnectionFactory mqConnFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
mqConnFactory.setTrustAllPackages(true);//允许传输自定义对象,如果是对象传输,必须加这个
try {
// 构造从工厂得到连接对象
//connection = connectionFactory.createConnection();
connection = mqConnFactory.createConnection();
// 启动
connection.start();
// 获取操作连接
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
destination = session.createQueue(queueName);
consumer = session.createConsumer(destination);
while (true) {
Message message=consumer.receive();
//TextMessage message = (TextMessage) consumer.receive(100000);
ObjectMessage objMsg = (ObjectMessage)message;
MqMessage msg=(MqMessage)objMsg.getObject();//自定义对象
if (null != msg) {
System.out.println(new Date().toLocaleString()+"收到消息:" + msg.getName());
}
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
}
public static void main(String[] args) {
ActivemqReceiver receiveThread = new ActivemqReceiver("test1");
receiveThread.start();
}
}
package com.activemq;
import java.util.Date;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 队列消息发送者
* @author pure
*/
public class ActivemqSender {
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;
// TextMessage message;
// 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
//connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
ActiveMQConnectionFactory mqConnFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
mqConnFactory.setTrustAllPackages(true);//允许传输自定义对象
try { // 构造从工厂得到连接对象
//connection = connectionFactory.createConnection();
connection = mqConnFactory.createConnection();
// 启动
connection.start();
// 获取操作连接
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
// 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
destination = session.createQueue("test1");
// 得到消息生成者【发送者】
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) throws Exception {
for (int i = 1; i <= 10; i++) {
MqMessage bean = new MqMessage();
bean.setName("测试"+i);
//TextMessage message = session.createTextMessage("ActiveMq 发送的消息" + i);
// 发送消息到目的地方
System.out.println("发送消息:" + "测试" + i);
producer.send(session.createObjectMessage(bean));//发送自定义对象
//producer.send(message);
}
}
}
注:这里需要修改默认配置,修改以下地方:
默认的:<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
修改后:<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" useJmx="true">
默认的:<managementContext createConnector="false"/>
修改后:<managementContext createConnector="true" connectorPort="11099" jmxDomainName="jmx-broker"/>
package com.activemq;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.apache.activemq.broker.jmx.BrokerViewMBean;
import org.apache.activemq.broker.jmx.QueueViewMBean;
/**
* 查看activemq消息队列详细信息
* @author pure
*
*/
public class ActivemqStatus {
public static void main(String[] args) {
JMXServiceURL url;
try {
url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:11099/jmxrmi"); //jmxrmi is connectorPah
JMXConnector connector = JMXConnectorFactory.connect(url, null);
connector.connect();
MBeanServerConnection connection = connector.getMBeanServerConnection();
// 需要注意的是,这里的jmx-broker必须和上面配置的名称相同
ObjectName name = new ObjectName("jmx-broker:brokerName=localhost,type=Broker");//区分大小写
//ObjectName name = new ObjectName("org.apache.activemq:brokerName=localhost,type=Broker");
BrokerViewMBean mBean = (BrokerViewMBean)MBeanServerInvocationHandler.newProxyInstance(connection, name, BrokerViewMBean.class, true);
for(ObjectName queueName : mBean.getQueues()) {//循环所有队列
QueueViewMBean queueMBean = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(connection, queueName, QueueViewMBean.class, true);
System.out.println("\n------------------------------\n");
System.out.println("queueName --- " + queueMBean.getName());// 消息队列名称
System.out.println("Size --- " + queueMBean.getQueueSize());// 队列中剩余的消息数
System.out.println("Number of consumers --- " + queueMBean.getConsumerCount());// 消费者数
System.out.println("Number of enqueue ---" + queueMBean.getEnqueueCount() );// 入队数
System.out.println("Number of dequeue ---" + queueMBean.getDequeueCount() );// 出队数
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
代码里面使用的端口号,皆可在conf/activemq.xml下面查看