`
longdick
  • 浏览: 584932 次
  • 性别: Icon_minigender_1
  • 来自: 0
社区版块
存档分类
最新评论

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:

 

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!----------------");
		}
	}

 

以下是符合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()来通知服务器。服务器接收到通知后采取相应的操作。

 

 

11
1
分享到:
评论
2 楼 MutouLin 2009-09-11  
可以创建永久订阅,即使不活动也不会丢失信息。规范里规定 connection.close()会关闭它的下属资源,session就不用显式关闭了。不过不知道提供商是否实现了规范。一看amq,还以为是apusic mq。。。汗
1 楼 darklipeng 2009-09-11  
好帖!

相关推荐

    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