`
madfroghe
  • 浏览: 120091 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Jms Topic和Queue的比较

    博客分类:
  • JMS
JMS 
阅读更多
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传输消息的代码,使用Amq作为Jms的实现,想要更clean的代码,可以考虑将Amq的实现DI:
 
view plaincopy to clipboardprint?
public void testMySend() throws JMSException {   
 Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection();   
     Session session = null;   
     Queue queue = null;   
     MessageProducer producer = null;   
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);   
     queue=session.createQueue("myTest");   
     producer= session.createProducer(queue);   
     Message msg=session.createTextMessage("hello");   
     producer.send(msg);      
     producer.close();   
     session.close();   
     connection.close();   
 }   
   
 public void testMyReceive() throws JMSException{   
 Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection();   
 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);   
 Queue queue = session.createQueue("myTest");   
 MessageConsumer consumer= session.createConsumer(queue);   
 consumer.setMessageListener(new MyListener());   
 connection.start();   
 consumer.close();   
 session.close();   
     connection.close();   
 }   
   
  消费端需要设定一个MessageListener:  
   
private class MyListener implements MessageListener{   
 public void onMessage(Message message) {   
 System.out.println("msg start!----------------");   
 try {   
  System.out.println(""+((TextMessage)message).getText());   
 } catch (JMSException e) {   
  e.printStackTrace();   
 }   
 System.out.println("msg end!----------------");   
 }   
 }  
public void testMySend() throws JMSException { 
 Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection(); 
     Session session = null; 
     Queue queue = null; 
     MessageProducer producer = null; 
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     queue=session.createQueue("myTest"); 
     producer= session.createProducer(queue); 
     Message msg=session.createTextMessage("hello"); 
     producer.send(msg);    
     producer.close(); 
     session.close(); 
     connection.close(); 
 } 
 
 public void testMyReceive() throws JMSException{ 
 Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection(); 
 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
 Queue queue = session.createQueue("myTest"); 
 MessageConsumer consumer= session.createConsumer(queue); 
 consumer.setMessageListener(new MyListener()); 
 connection.start(); 
 consumer.close(); 
 session.close(); 
     connection.close(); 
 } 
 
  消费端需要设定一个MessageListener:
 
private class MyListener implements MessageListener{ 
 public void onMessage(Message message) { 
 System.out.println("msg start!----------------"); 
 try { 
  System.out.println(""+((TextMessage)message).getText()); 
 } catch (JMSException e) { 
  e.printStackTrace(); 
 } 
 System.out.println("msg end!----------------"); 
 } 
 } 

view plaincopy to clipboardprint?
以下是符合Jms1.1规范的使用Topic 发送消息的代码:  
 
public void testMyTopicPublisher() throws JMSException {   
  Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection();   
     Session session = null;   
     Topic topic = null;   
     MessageProducer producer = null;   
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);   
     topic=session.createTopic("myTopicTest");   
     producer= session.createProducer(topic);   
     producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);   
     Message msg=session.createTextMessage("hello and whatever u say");     
     producer.send(msg);    
     producer.close();   
     session.close();   
     connection.close();   
 }  
  以下是符合Jms1.1规范的使用Topic 接收消息的代码:  
   
public static void testMyTopicConsumer() throws JMSException, InterruptedException{   
 Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection();   
  Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);   
  Topic topic = session.createTopic("myTopicTest");   
  MessageConsumer consumer= session.createConsumer(topic);   
  consumer.setMessageListener(new MyListener());   
  connection.start();   
 } 
以下是符合Jms1.1规范的使用Topic 发送消息的代码:

public void testMyTopicPublisher() throws JMSException { 
  Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection(); 
     Session session = null; 
     Topic topic = null; 
     MessageProducer producer = null; 
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     topic=session.createTopic("myTopicTest"); 
     producer= session.createProducer(topic); 
     producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 
     Message msg=session.createTextMessage("hello and whatever u say");   
     producer.send(msg);  
     producer.close(); 
     session.close(); 
     connection.close(); 
 }
  以下是符合Jms1.1规范的使用Topic 接收消息的代码:

public static void testMyTopicConsumer() throws JMSException, InterruptedException{ 
 Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection(); 
  Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE); 
  Topic topic = session.createTopic("myTopicTest"); 
  MessageConsumer consumer= session.createConsumer(topic); 
  consumer.setMessageListener(new MyListener()); 
  connection.start(); 
 }
  

jms在创建Session时可以有两个参数,第一个参数是是否使用事务,第二个参数是消费者向发送者确认消息已经接收的方式:
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
  确认消息的方式有如下三种:
  AUTO_ACKNOWLEDGE(自动通知)
  CLIENT_ACKNOWLEDGE(客户端自行决定通知时机)
  DUPS_OK_ACKNOWLEDGE(延时//批量通知)
  如果使用的是 客户端自行决定通知时机 方式,那么需要在MessageListener里显式调用message.acknowledge()来通知服务器。服务器接收到通知后采取相应的操作。
分享到:
评论

相关推荐

    JMS中topic和queue两种实现方式

    JMS中topic和queue两种实现方式

    Queue与Topic的比较

    Queue与Topic的比较,学习JMS和activemq必须看的资料之一

    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...

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

    weblogic中使用JMS发送和接受消息(Queue and TOPIC)

    一个jms activemq Topic 消息实例

    一个jms activemq Topic 消息实例 关于jms JMS 是接口,相当于jdbc ,要真正使用它需要某些厂商进行实现 ,即jms provider 常见的jms provider 有 ActiveMQ JBoss 社区所研发的 HornetQ (在jboss6 中默认即可以...

    spring boot jsm ibmmq topic queue

    spring boot jsm ibmmq topic queue 两种方式实现

    jms官方接口

    官方jar,用于JMS queue和topic开发

    activeMQ JMS 3种创建方式

    activeMQ JMS 3种创建方式 公共方式 QUEUE TOPIC

    Spring 实现远程访问详解——jms和activemq

    本章我将通过spring jms和activemq实现单Web项目服务器间异步访问和多Web项目服务器间异步访问。 一. 简介 1. 什么是Apache ActiveMq Apache ActiveMq是最流行和最强大的开源消息和集成服务器。同时Apache ActiveMq...

    WebLogic jms三个实例

    三个jms的实例,实现了jms的queue和topic,同时也实现了远程传送消息和本地传送消息,另外也分别实现了session的事务和非事务模式,有了这三个例子应该可以满足你的任何关于jms的需求了,由于上传限制,另外还需要...

    JMS规范v1.1官方手册.pdf

    JMS规范v1.1的官方原版,大家学习ActiveMQ的时候可以进行参考。详细介绍了包括连接、session、生产者、消费者、topic、queue等概念。深入学习的必备手册。

    WebLogic 11g JMS图文配置 和 详细的示例代码

    WebLogic11g JMS图文配置 和 详细的示例代码 压缩包中:含 配置截图,eclipse示例代码工厂,Queue和Topic两种方式都有。以上从网上收集并测试通过。

    spring-jms入门

    spring-jms入门

    remote-jms-example

    jms-queue add --queue-address=HelloWorldQueue --entries=[queue/HelloWorldQueue java:jboss/exported/queue/HelloWorldQueue] jms-topic add --topic-address=HelloWorldTopic --entries=[topic/...

    jms简单demo,集成spring和不集成

    jms简单demo,activemq集成spring和不集成

    JMS (Java Message Service)教程

    JMS (Java Message Service): Queue, Topic两种模式

    Springboot-activeMQ

    ActiveMQ是Apache下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS ...activemq的queue和topic  JMS中定义了两种消息模型:  点对点(point to point, queue)  发布/订阅(publish/subscribe,topic)。

    weblogic jms configuration

    container for JMS queue and topic resources defined within JMS modules that are targeted to specific that JMS server. A JMS server’s primary responsibility for its targeted destinations is to ...

    SonicMQ中jms小程序

    SonicMQ中的包含了topic,queue的收(异步)发代码。!!!!!!!!!!!!!!,

Global site tag (gtag.js) - Google Analytics