ActiveMQ发布订阅模式(topic模式)
- 生产者生产一条消息,可以被多个消费者接收一次。
生产者
- topic模式,1对多。
package com.cjw.activemq;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* ActiveMQ中的生产者(Producer)
*
*/
public class MyProducer {
public void sendhello2ActiveMq(String name) {
TopicSession session = null;
TopicConnection conn = null;
try {
TopicConnectionFactory factory = new ActiveMQConnectionFactory("admin", "admin", "tcp://192.168.197.130:61616");
conn = factory.createTopicConnection();
conn.start();
session = conn.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
// 创建消息队列
Topic topic = session.createTopic("test-topic");
// 创建消息发送者
TopicPublisher publisher = session.createPublisher(topic);
// 设置持久化模式 NON_PERSISTENT不开启 PERSISTENT 开启 默认是开启
publisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
MapMessage mapMessage = session.createMapMessage();
mapMessage.setString("name", name);
mapMessage.setString("address", "深圳");
publisher.send(mapMessage);
// 提交会话
session.commit();
} catch (Exception e) {
e.printStackTrace();
System.out.println("访问ActiveMQ服务发生错误!!");
} finally {
try {
// 回收会话资源
if (null != session)
session.close();
} catch (JMSException e) {
e.printStackTrace();
}
try {
// 回收链接资源
if (null != conn)
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
消费者
- 可以开启多个消费者,案例中的消费者存活100s。100s可以接受生产者生产的每一条消息。
- 不接受开启前的,生产者发送的消息。
package com.cjw.activemq;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* ActiveMQ中的生产者(Producer)
*
*/
public class MyProducer {
public void sendhello2ActiveMq(String name) {
TopicSession session = null;
TopicConnection conn = null;
try {
TopicConnectionFactory factory = new ActiveMQConnectionFactory("admin", "admin", "tcp://192.168.197.130:61616");
conn = factory.createTopicConnection();
conn.start();
session = conn.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
// 创建消息队列
Topic topic = session.createTopic("test-topic");
// 创建消息发送者
TopicPublisher publisher = session.createPublisher(topic);
// 设置持久化模式 NON_PERSISTENT不开启 PERSISTENT 开启 默认是开启
publisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
MapMessage mapMessage = session.createMapMessage();
mapMessage.setString("name", name);
mapMessage.setString("address", "深圳");
publisher.send(mapMessage);
// 提交会话
session.commit();
} catch (Exception e) {
e.printStackTrace();
System.out.println("访问ActiveMQ服务发生错误!!");
} finally {
try {
// 回收会话资源
if (null != session)
session.close();
} catch (JMSException e) {
e.printStackTrace();
}
try {
// 回收链接资源
if (null != conn)
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
测试
- 先开启消费者,在开启生产者。
package com.cjw.test;
import org.junit.Test;
import com.cjw.activemq.MyConsumer;
import com.cjw.activemq.MyProducer;
public class Test01 {
/**
* 测试:topic模式,发送一条消息
*/
@Test
public void test() {
MyProducer producer = new MyProducer();
producer.sendhello2ActiveMq("cjw");
System.out.println("消息发送成功!");
}
/**
* 测试:topic模式,接收一条消息,可以重复运行,开启多个消费者.
*/
@Test
public void test2() {
System.out.println("消费者开启...");
MyConsumer consumer = new MyConsumer();
consumer.reciveHelloFormActiveMq();
System.out.println("消息接收成功!");
}
}
运行截图
后台查看
项目打包
项目打包 提取码:fbei
环境:eclipse,jdk1.8,maven