`
zzc1684
  • 浏览: 1224157 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Jms两种message传输方式Topic和Queue的比较

    博客分类:
  • JMS
阅读更多

/**

*  转载请注明作者longdick    http://longdick.iteye.com

*

*/

 

 

Jms规范里的两种message传输方式Topic和Queue,两者的对比如下表():

 

 

  Topic Queue
概要 Publish Subscribe messaging 发布订阅消息 Point-to-Point 点对点
有无状态 topic数据默认不落地,是无状态的。

Queue数据默认会在mq服务器上以文件形式保存,比如Active MQ一般保存在$AMQ_HOME\data\kr-store\data下面。也可以配置成DB存储。

完整性保障 并不保证publisher发布的每条数据,Subscriber都能接受到。 Queue保证每条数据都能被receiver接收。
消息是否会丢失 一般来说publisher发布消息到某一个topic时,只有正在监听该topic地址的sub能够接收到消息;如果没有sub在监听,该topic就丢失了。 Sender发送消息到目标Queue,receiver可以异步接收这个Queue上的消息。Queue上的消息如果暂时没有receiver来取,也不会丢失。
消息发布接收策略 一对多的消息发布接收策略,监听同一个topic地址的多个sub都能收到publisher发送的消息。Sub接收完通知mq服务器 一对一的消息发布接收策略,一个sender发送的消息,只能有一个receiver接收。receiver接收完后,通知mq服务器已接收,mq服务器对queue里的消息采取删除或其他操作。

 

以下是符合Jms1.1规范的使用Queue传输消息的代码,使用Active mq作为Jms的实现,想要更clean的代码,可以考虑将Amq的实现DI:

 

Java代码  收藏代码
  1. public void testMySend() throws JMSException {  
  2.         Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection();  
  3.             Session session = null;  
  4.             Queue queue = null;  
  5.             MessageProducer producer = null;  
  6.             session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  
  7.             queue=session.createQueue("myTest");  
  8.             producer= session.createProducer(queue);  
  9.             Message msg=session.createTextMessage("hello");  
  10.             producer.send(msg);        
  11.             producer.close();  
  12.             session.close();  
  13.             connection.close();  
  14.     }  
  15.       
  16.     public void testMyReceive() throws JMSException{  
  17.         Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection();  
  18.         Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  
  19.         Queue queue = session.createQueue("myTest");  
  20.         MessageConsumer consumer= session.createConsumer(queue);  
  21.         consumer.setMessageListener(new MyListener());  
  22.         connection.start();  
  23.         consumer.close();  
  24.         session.close();  
  25.             connection.close();  
  26.     }  
  27.       

 

消费端需要设定一个MessageListener:

 

Java代码  收藏代码
  1. private class MyListener implements MessageListener{  
  2.         public void onMessage(Message message) {  
  3.         System.out.println("msg start!----------------");  
  4.         try {  
  5.             System.out.println(""+((TextMessage)message).getText());  
  6.         } catch (JMSException e) {  
  7.             e.printStackTrace();  
  8.         }  
  9.         System.out.println("msg end!----------------");  
  10.         }  
  11.     }  

 

以下是符合Jms1.1规范的使用Topic 发送消息的代码:

 

Java代码  收藏代码
  1. public void testMyTopicPublisher() throws JMSException {  
  2.          Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection();  
  3.             Session session = null;  
  4.             Topic topic = null;  
  5.             MessageProducer producer = null;  
  6.             session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  
  7.             topic=session.createTopic("myTopicTest");  
  8.             producer= session.createProducer(topic);  
  9.             producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);  
  10.             Message msg=session.createTextMessage("hello and whatever u say");      
  11.             producer.send(msg);    
  12.             producer.close();  
  13.             session.close();  
  14.             connection.close();  
  15.     }  

 

以下是符合Jms1.1规范的使用Topic 接收消息的代码:

 

Java代码  收藏代码
  1. public static void testMyTopicConsumer() throws JMSException, InterruptedException{  
  2.         Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection();  
  3.          Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);  
  4.          Topic topic = session.createTopic("myTopicTest");  
  5.          MessageConsumer consumer= session.createConsumer(topic);  
  6.          consumer.setMessageListener(new MyListener());  
  7.          connection.start();  
  8.     }  

 

jms在创建Session时可以有两个参数,第一个参数是是否使用事务,第二个参数是消费者向发送者确认消息已经接收的方式:

 

Java代码  收藏代码
  1. Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);  

 

确认消息的方式有如下三种:

AUTO_ACKNOWLEDGE(自动通知)

CLIENT_ACKNOWLEDGE(客户端自行决定通知时机)

DUPS_OK_ACKNOWLEDGE(延时//批量通知)

 

如果使用的是 客户端自行决定通知时机 方式,那么需要在MessageListener里显式调用message.acknowledge()来通知服务器。服务器接收到通知后采取相应的操作。

分享到:
评论

相关推荐

    JMS中topic和queue两种实现方式

    JMS主要提供了两种消息模式:主题(Topic)和队列(Queue),这两种模式在实现方式和功能上有所不同。 1. 主题(Topic): - **发布/订阅模型**:主题基于发布/订阅模型,其中多个生产者可以发布消息到一个特定的...

    Queue与Topic的比较

    Queue 和 Topic 是 JMS(Java Message Service)中两种基本的消息模式,分别对应 Point-to-Point 和 Publish/Subscribe 模式。 Queue 模式 在 Queue 模式中,一条消息仅能被一个消费者(Consumer)接收。如果在...

    消息队列 Queue与Topic区别.docx

    消息队列(Message Queue)是一种应用程序间通信机制,允许程序之间通过发送和接收消息进行通信,而不必直接建立连接。它提供了异步处理机制,使得消息的发送者无需等待接收者处理完毕即可继续执行,从而提高了系统...

    ActiveMQ的queue和topic两种模式的示例演示参照.pdf

    在ActiveMQ中,有两种主要的消息传递模式:Queue和Topic。这两种模式都是基于JMS(Java Message Service)标准,用于在分布式环境中实现异步通信。理解它们的区别和应用场景至关重要。 **Queue(队列)模式** ...

    spring boot jsm ibmmq topic queue

    标题"spring boot jsm ibmmq topic queue"涉及到的是如何在Spring Boot项目中使用JMS与IBM MQ进行交互,包括发布/订阅模型(Topic)和点对点模型(Queue)两种方式。下面将详细解释这两个概念以及如何在Spring Boot...

    JMS消息服务代码(java message service)

    在JMS中,有两种主要的消息传递模型:Point-to-Point(PTP)和Publish/Subscribe(发布/订阅)。 Point-to-Point(PTP)模型: PTP模型是基于队列的通信方式,其中消息生产者将消息发送到一个队列,然后消息消费者...

    JMS简介 Java Message Service

    JMS提供了一组标准接口,如`MessageProducer`用于发送消息,`MessageConsumer`用于接收消息,以及`Queue`和`Topic`接口,分别对应点对点(Point-to-Point, PTP)和发布/订阅(Publish/Subscribe, Pub/Sub)两种消息...

    ESB应用JMS_Topic

    JMS支持两种类型的消息模型:点对点(Point-to-Point, Queue)和发布/订阅(Publish/Subscribe, Topic)。 在本案例中,我们将深入探讨如何在JBoss ESB中利用JMS Topic实现消息通信。 #### 二、JMS Topic应用场景 ...

    javax.jms.jar

    javax.jms.Topic.class javax.jms.MapMessage.class javax.jms.ObjectMessage.class javax.jms.StreamMessage.class javax.jms.TextMessage.class javax.jms.MessageListener.class javax.jms.MessageProducer.class...

    深入掌握 JMS(java message service)

    - **消息模型**:JMS支持两种消息通信模型——**点到点**(Point-to-Point, P2P)和**发布/订阅**(Publish/Subscribe, Pub/Sub)。这两种模型分别适用于不同的场景: - **点到点模型**:在这种模型下,消息由发送...

    JMS信息传输实例代码

    JMS 支持两种消息通信模型:点到点(point-to-point)(P2P)模型和发布/订阅(Pub/Sub)模型。 点到点模型规定了一个消息只能有一个接收者;发布/订阅模型允许一个消息可以有多个接收者。在点到点模型中,消息生产...

    weblogic中使用JMS发送和接受消息

    WebLogic Server是一款由Oracle公司提供的企业级应用服务器,它支持Java Message Service (JMS) 规范,允许在分布式环境中可靠地发送和接收消息。JMS是Java平台上的标准接口,用于实现应用程序间的异步通信。本文将...

    spring-jms入门

    有两种方式接收消息: - **MessageListenerContainer**:通过实现`MessageListener`接口,Spring容器会自动启动监听线程,接收到消息后调用监听器方法。 - **JmsTemplate.receive()**:阻塞式接收,调用后会等待直到...

    spring下queue与持久订阅topic实现

    在Spring框架中,消息队列(Message Queue,简称MQ)是一种重要的组件,它允许应用程序之间进行异步通信,提高系统的可扩展性和解耦性。在本主题中,我们将深入探讨如何在Spring环境下实现基于Queue的通信以及持久...

    JMS 简单使用指南

    - **消息服务体系结构**:JMS定义了两种主要的消息传送模型——点对点(Point-to-Point, PTP)和发布/订阅(Publish/Subscribe, Pub/Sub)模型。 - **消息传送模型对照表**:PTP模式使用Queue,消息只能被一个消费...

    Spring 和 activemq 搭建JMS开发系统示例

    它支持两种消息模型:点对点(Queue)和发布/订阅(Topic)。点对点模型中,消息由一个生产者发送到一个队列,一个消费者接收并处理该消息;发布/订阅模型中,消息被发布到一个主题,多个订阅者可以接收。 **二、...

    JMS实现的信息的广播订阅

    首先,我们要理解JMS中的两种主要概念:Queue(队列)和Topic(主题)。Queue遵循点对点模型,每个消息只能被一个消费者接收,而Topic遵循发布/订阅模型,允许多个订阅者同时接收到同一消息。在广播订阅场景中,...

    java.jms.jar JMS需要的JAR包

    2. **消息队列(Queue)** 和 **主题(Topic)**:是两种消息目的地类型。消息队列遵循“先进先出”(FIFO)原则,每个消息只有一个消费者;而主题支持发布/订阅模式,一个消息可以被多个订阅者消费。 3. **消息...

    jms消息通讯

    JMS中包含两个主要对象:Message和Destination。Message是数据载体,包含了要传递的信息,可以是文本、二进制数据或特定的JMS对象。Destination是消息的目标,可以是队列(Queue)或主题(Topic)。 JMS提供两种...

Global site tag (gtag.js) - Google Analytics