topic 是发布订阅模式,一个生产者可以一个消息,可以被多个消费者消费。
topic 默认是不存在于MQ服务器中的,一旦发送之后,如果没有订阅,消息则丢失。
生产者:
public class TopicProduct {
public static void main(String[] args) throws Exception {
//创建工厂
ConnectionFactory facroty = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
//利用工厂创建链接
Connection connection = facroty.createConnection();
//链接开启'
connection.start();
//使用 connection创建一个 session 对象
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//session 创建destination
Topic topic = session.createTopic("topic-test");
//session 创建 produce
MessageProducer producer = session.createProducer(topic);
//sesssion 创建message
TextMessage message = session.createTextMessage("hello activemq topic 12");
//发送
producer.send(message);
producer.close();
session.close();
connection.close();
}
}
两个消费者:
public class TpitcCustomer {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//Queue queue = session.createQueue("queue-test");
Topic topic = session.createTopic("topic-test");
MessageConsumer consumer = session.createConsumer(topic);
while(true){
// Message message = consumer.receive(); 会一直阻塞,直到有消息送达
//阻塞,即代码不会往下执行
//接收消息 (参数的值表示的是超过一定时间 以毫秒为单位就断开连接)
//如下表示 10s 后接受不到生产者发送的消息
Message message = consumer.receive(10000);
if(message == null){
break;
}
if(message instanceof TextMessage){
TextMessage textmessage = (TextMessage)message;
System.out.println(textmessage.getText());
}
}
//此处用来模拟用户系统开启状态,这样才能得到订阅的消息
Thread.sleep(30000);
connection.close();
session.close();
connection.close();
}
}
public class TpitcCustomer2 {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("topic-test");
MessageConsumer consumer = session.createConsumer(topic);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
if(message instanceof TextMessage){
TextMessage textMessage = (TextMessage)message;
try {
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
//此处用来模拟用户系统开启状态,这样才能得到订阅的消息
Thread.sleep(300000);
connection.close();
session.close();
connection.close();
}
}
生产者发送消息,如果此时消费者没有开启,则无法拿到消息,消费者迟于生产者开启无法拿到消息。
两个消费者的线程需要时开启的状态(系统是开启的),这样才能得到订阅的消息,消费者要优先于生产者开启,才能拿到消息。