activeMQ入门(发布订阅消息)

发送主题(topic)类

package com.jason.testmq;

import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

public class SendTopic {
	private static final String url = "tcp://localhost:61616";
	private static final String TOPIC_NAME = "choice.topic";
	//private String expectedBody = "<hello>world!two</hello>";
	//private String expectedBody = "stop";

	public void sendMessage() throws JMSException {
		Connection connection = null;
		try {
			ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
					url);
			connection = (Connection) connectionFactory.createConnection();
			connection.start();
			Session session = (Session) connection.createSession(false,
					Session.AUTO_ACKNOWLEDGE);
			Destination destination = session.createTopic(TOPIC_NAME);
			MessageProducer producer = session.createProducer(destination);
			producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//			TextMessage message = session.createTextMessage(expectedBody);
//			message.setStringProperty("headname", "remoteB");
			JmsTestMessage testMessage = new JmsTestMessage();
			testMessage.setId("1234567");
			testMessage.setMsg("stop");
			testMessage.setStatus(1);
			ObjectMessage message = session.createObjectMessage(testMessage);
			producer.send(message);
			producer.close();
			session.close();
			connection.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		SendTopic sndMsg = new SendTopic();
		try {
			sndMsg.sendMessage();
		} catch (Exception ex) {
			System.out.println(ex.toString());
		}
	}
}

接收订阅消息类

/**
 * 
 */
package com.jason.testmq;

import java.io.Serializable;

import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;

public class ReceiveTopic implements MessageListener {
	private static final String url = "tcp://localhost:61616";
	private static final String TOPIC_NAME = "choice.topic";
	
	private boolean stop = false;

	public void receiveMessage() {
		(new Thread(new ReceiveTopicRunnable())).start();
	}

	public void onMessage(Message message) {
//		try {
//			if (message instanceof TextMessage) {
//				TextMessage txtMsg = (TextMessage) message;
//				String msg = txtMsg.getText();
//				System.out.println("Received: " + msg);
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
		try {
			if (message instanceof ObjectMessage) {
				ObjectMessage objMsg = (ObjectMessage)message;
				Serializable obj = objMsg.getObject();
				if (obj instanceof JmsTestMessage) {
					JmsTestMessage testMessage = (JmsTestMessage)obj;
					System.out.println("Received new msg id is " + testMessage.getId() + ",msg is " + testMessage.getMsg() + ",status is " + testMessage.getStatus());
					if ("stop".equals(testMessage.getMsg())) {
						this.stop = true;
					}
				} else {
					System.out.println("it is not JmsTestMessage");
				}
				
			} else {
				System.out.println("other type message with type is " + message.getJMSType());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String args[]) {
		ReceiveTopic rm = new ReceiveTopic();
		rm.receiveMessage();
	}
	
	private class ReceiveTopicRunnable implements Runnable {

		public void run() {
			Connection connection = null;
			ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
					url);
			try {
				connection = connectionFactory.createConnection();
				Session session = connection.createSession(false,
						Session.AUTO_ACKNOWLEDGE);
				Topic topic = session.createTopic(TOPIC_NAME);
				MessageConsumer consumer = session.createConsumer(topic);
				consumer.setMessageListener(ReceiveTopic.this);
				connection.start();
				while (!ReceiveTopic.this.stop) {
					try {
						Thread.sleep(10000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				System.out.println("Closing connection");
				consumer.close();
				session.close();
				connection.close();
			} catch (JMSException e) {
				e.printStackTrace();
			}
		
			
		}
		
	}

}

消息类

/**
 * 
 */
package com.jason.testmq;

import java.io.Serializable;

/**
 * @author jasonzhang
 *
 */
public class JmsTestMessage implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String id;
	private String msg;
	private int status;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	public int getStatus() {
		return status;
	}
	public void setStatus(int status) {
		this.status = status;
	}
}

因为发布订阅消息的方式是指在发布消息到topic时,如果当前有订阅者正在监听该主题则该订阅才能收到消息,如果是在主题发布完后才进行监听的则接收不到之前发布的消息,所以这边接收消息的类必须以线程的方式启动并且在运行发布消息的类之前运行订阅消息的类。

参考链接:

ActiveMQ的queue以及topic两种消息处理机制分析

ActiveMQ之Topic 例子

你可能感兴趣的:(activemq,topic)