Java activemq消息队列入门学习

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下面查看




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值