1.消费者订阅主题之后只能收到订阅之后的消息
2.订阅模式和队列模式不同,topic模式是先启动消费者,再启动生产者,因为没有订阅,生产者者不会生产消息
3.允许客户创建持久订阅,这一定程度上放松了时间要求,即允许消费者消费他未激活状态时的消息
代码实现流程和队列queue一模一样,只是目的地换成了topic而已,简单的一批,不说了上代码
生产者:
package com.xiaowu.activemq;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import static javax.jms.Session.AUTO_ACKNOWLEDGE;
public class JmsProducer_Topic {
public static final String ACTIVEMQ_URL="tcp://152.136.12.27:61616";
public static final String Topic_Name="topic01";
public static void main(String[] args) throws JMSException {
//create factory
ActiveMQConnectionFactory activeMQConnectionFactory=new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//create connect and start
Connection connection=activeMQConnectionFactory.createConnection();
connection.start();
//create session
Session session = connection.createSession(false, AUTO_ACKNOWLEDGE);
//create 目的地
Topic topic=session.createTopic(Topic_Name);
//create producer
MessageProducer messageProducer=session.createProducer(topic);
//send massege
for(int i=0;i<6;i++){
//create message
TextMessage textMessage=session.createTextMessage("topic_message---"+i);
messageProducer.send(textMessage);
}
messageProducer.close();
session.close();
connection.close();
System.out.println("消息发送完毕");
}
}
消费者:
package com.xiaowu.activemq;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.io.IOException;
import static javax.jms.Session.AUTO_ACKNOWLEDGE;
public class JmsConsumerTopic {
public static final String ACTIVEMQ_URL="tcp://152.136.12.27:61616";
public static final String Topic_Name="topic01";
public static void main(String[] args) throws JMSException, IOException {
//1.create factory
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//2.create connect and start
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
//3.create session
Session session = connection.createSession(false, AUTO_ACKNOWLEDGE);
//4.create 目的地
Topic topic=session.createTopic(Topic_Name); //5.create consumer
MessageConsumer messageConsumer = session.createConsumer(topic);
//6.监听服务器
messageConsumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
//判断消息是否为空并且是否是TextMessage类型
if (message!=null&&message instanceof TextMessage){
try {
//消费前保证和生产者生产的消息类型相同,强制转换
System.out.println("消费者监听到消息:"+((TextMessage) message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
//System.in.read()方法是为了保证监听不到消息时程序不灭
System.in.read();
//7.释放资源
messageConsumer.close();
session.close();
connection.close();
}
}
启动时注意,先启动消费者,再启动生产者,否则发送的消息白费了,运行结果:
服务器端