ActiveMQ学习笔记-04——主题Topic案例
参考:【尚硅谷ActiveMQ教程(MQ消息中间件快速入门)
-
生产者编码
public class JmsProduce_Topic { public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616"; public static final String TOPIC_NAME = "topic01"; public static void main(String[] args) throws JMSException { //1 创建连接工厂 按照给定的URL地址,采用默认用户名密码 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); //2 通过连接工厂,获得连接connection Connection connection = activeMQConnectionFactory.createConnection(); connection.start(); //3 创建会话session //两个参数(事务/签收) Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //4 创建目的地(具体是队列还是主题) Topic topic = session.createTopic(TOPIC_NAME); //5 创建消息的生产者 MessageProducer messageProducer = session.createProducer(topic); //6 通过使用messageProducer生产3条消息发送到MQ的队列里来 for (int i = 1; i <= 3; i++) { //7 创建消息 TextMessage textMessage = session.createTextMessage("TOPIC_NAME---" + i); //8 通过messageProducer发送给MQ messageProducer.send(textMessage); } //9 关闭资源 messageProducer.close(); session.close(); connection.close(); System.out.println("----消息发布完成----"); } }
-
消费者编码
public class JmsConsumer_Topic { public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616"; public static final String TOPIC_NAME = "topic01"; public static void main(String[] args) throws JMSException, IOException { //1 创建连接工厂 按照给定的URL地址,采用默认用户名密码 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); //2 通过连接工厂,获得连接connection Connection connection = activeMQConnectionFactory.createConnection(); connection.start(); //3 创建会话session //两个参数(事务/签收) Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //4 创建目的地(具体是队列还是主题) Topic topic = session.createTopic(TOPIC_NAME); //5 创建消费者 MessageConsumer messageConsumer = session.createConsumer(topic); //通过监听到方式消费消息 messageConsumer.setMessageListener((message) -> { if (null != message && message instanceof TextMessage) { TextMessage textMessage = (TextMessage) message; try { System.out.println("----消费者接收到消息" + textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } }); System.in.read(); messageConsumer.close(); session.close(); connection.close(); } }
-
启动,先启动消费者,再启动生产者。
6. Topic模式与Queue模式对比
比较项目 | Top模式队列 | Queue模式队列 |
---|---|---|
工作模式 | “订阅-发布模式”,如果当前没有订阅者,消息将会被丢弃。如果有多个订阅者,那么这些订阅者都会收到消息 | "负载均衡"模式,如果当前没有消费者,消息也不会丢弃;如果有多个消费者,那么一条消息也只会发送给其中一个消费者,并且要求消费者ack信息 |
有无状态 | 无状态 | Queue数据默认会在mq服务器上以文件形式保存,比如ActiveMQ一般保存在$AMQ_HOME\data\kr-store-data下面。也可以配制成DB存储 |
传递完整性 | 如果没有订阅者,消息会被丢弃 | 消息不会丢弃 |
处理效率 | 由于消息要按照订阅者的数量进行复制,所以处理性能会随着订阅者的增加而明显降低,并且还要结合不同消息协议自身的性能差异 | 由于一条消息指发送给一个消费者,所以就算消费者再多,性能也不会有明显降低。当然不同消息协议的具体性能也是有差异的 |