//ActiveMQ JMS 一对多发送接收消息
/**
* 订阅/发布消息
*
* 和上一篇一对一大致相同
* 一对一提供者使用的是createQueue
* 一对多提供者发布消息用createTopic
*
* 另外发布/订阅模式需要 先建立订阅(消费者)
* 才会接收到发布的消息
*
*
* @param args
* @throws JMSException
JMSProducer类:
JMSConsumer:
Commons:
/**
* 订阅/发布消息
*
* 和上一篇一对一大致相同
* 一对一提供者使用的是createQueue
* 一对多提供者发布消息用createTopic
*
* 另外发布/订阅模式需要 先建立订阅(消费者)
* 才会接收到发布的消息
*
*
* @param args
* @throws JMSException
*/
测试类:
package com.jms.test;
import javax.jms.JMSException;
public class Test {
//ActiveMQ JMS 一对多发送接收消息
/**
* 订阅/发布消息
*
* 和上一篇一对一大致相同
* 一对一提供者使用的是createQueue
* 一对多提供者发布消息用createTopic
*
* 另外发布/订阅模式需要 先建立订阅(消费者)
* 才会接收到发布的消息
*
*
* @param args
* @throws JMSException
*/
public static void main(String[] args) throws JMSException {
//消费者接收消息
JMSConsumer.resumeMessage("消费者1");
//消费者接收消息
JMSConsumer.resumeMessage("消费者2");
//提供者发送消息
JMSProducer.produceMessage();
}
}
JMSProducer类:
package com.jms.test;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JMSProducer {
public static void produceMessage() throws JMSException {
ConnectionFactory cf;//jmx连接工厂
Connection conn;//jms连接
Session session;//会话线程
Destination destination;//发送/接收目标
MessageProducer producer;//生产者
//1、创建ConnectionFactory
cf = new ActiveMQConnectionFactory(Commons.USERNAME, Commons.PASSWORD, Commons.BROKERURL);
//2、获得连接
conn = cf.createConnection();
//3、开始连接
conn.start();
//4、获得Session会话线程 参数1:是否启动事物,参数2:确认方式,一般Session.AUTO_ACKNOWLEDGE比较常用,
//另外的值日后用到再查询,目前就只做demo理解
//AUTO_ACKNOWLEDGE = 1 自动确认
//CLIENT_ACKNOWLEDGE = 2 客户端手动确认
//DUPS_OK_ACKNOWLEDGE = 3 自动批量确认
//SESSION_TRANSACTED = 0 事务提交并确认
session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE);
//5、创建队列
destination = session.createTopic(Commons.TOPICNAME);
//6、获得生产者
producer = session.createProducer(destination);
//发送消息
for (int i = 0; i < 5; i++) {
System.out.println("Now producing "+i+" message ");
Message message = session.createTextMessage(" The message is "+(i+1));
producer.send(message);
}
//7、提交实物
session.commit();
//关闭资源
producer.close();
session.close();
conn.close();
}
}
JMSConsumer:
package com.jms.test;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JMSConsumer {
public static void resumeMessage(String consumerName) {
ConnectionFactory cf;// jmx连接工厂
Connection conn = null;// jms连接
Session session = null;// 会话线程
Destination destination;// 发送/接收目标
MessageConsumer consumer = null;// 消费者
try {
cf = new ActiveMQConnectionFactory(Commons.USERNAME, Commons.PASSWORD, Commons.BROKERURL);
conn = cf.createConnection();
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic(Commons.TOPICNAME);
consumer = session.createConsumer(destination);
consumer.setMessageListener(new ConsumeListener(consumerName));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
try {
//消费者不能关闭连接,如果关闭连接,则接受不到消息
System.out.println("关闭连接");
//conn.close();
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}
}
}
// JMS监听器,需要集成Listener
class ConsumeListener implements MessageListener {
private String consumeName = "";
public ConsumeListener(String consumeName) {
super();
this.consumeName = consumeName;
}
@Override
public void onMessage(Message message) {
// TODO Auto-generated method stub
try {
TextMessage text = (TextMessage) message;
System.out.println(consumeName + " reciving: " + text.getText());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
Commons:
package com.jms.test;
import org.apache.activemq.ActiveMQConnection;
public class Commons {
public static String USERNAME = ActiveMQConnection.DEFAULT_USER;//默认连接JMS用户名
public static String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;//默认连接JMS密码
public static String BROKERURL = ActiveMQConnection.DEFAULT_BROKER_URL;//默认连接JMSURL
public static String TOPICNAME = "TESTTOPIC";
}