/**
* 转载请注明作者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()来通知服务器。服务器接收到通知后采取相应的操作。
分享到:
相关推荐
JMS主要提供了两种消息模式:主题(Topic)和队列(Queue),这两种模式在实现方式和功能上有所不同。 1. 主题(Topic): - **发布/订阅模型**:主题基于发布/订阅模型,其中多个生产者可以发布消息到一个特定的...
Queue 和 Topic 是 JMS(Java Message Service)中两种基本的消息模式,分别对应 Point-to-Point 和 Publish/Subscribe 模式。 Queue 模式 在 Queue 模式中,一条消息仅能被一个消费者(Consumer)接收。如果在...
消息队列(Message Queue)是一种应用程序间通信机制,允许程序之间通过发送和接收消息进行通信,而不必直接建立连接。它提供了异步处理机制,使得消息的发送者无需等待接收者处理完毕即可继续执行,从而提高了系统...
在ActiveMQ中,有两种主要的消息传递模式:Queue和Topic。这两种模式都是基于JMS(Java Message Service)标准,用于在分布式环境中实现异步通信。理解它们的区别和应用场景至关重要。 **Queue(队列)模式** ...
标题"spring boot jsm ibmmq topic queue"涉及到的是如何在Spring Boot项目中使用JMS与IBM MQ进行交互,包括发布/订阅模型(Topic)和点对点模型(Queue)两种方式。下面将详细解释这两个概念以及如何在Spring Boot...
在JMS中,有两种主要的消息传递模型:Point-to-Point(PTP)和Publish/Subscribe(发布/订阅)。 Point-to-Point(PTP)模型: PTP模型是基于队列的通信方式,其中消息生产者将消息发送到一个队列,然后消息消费者...
JMS提供了一组标准接口,如`MessageProducer`用于发送消息,`MessageConsumer`用于接收消息,以及`Queue`和`Topic`接口,分别对应点对点(Point-to-Point, PTP)和发布/订阅(Publish/Subscribe, Pub/Sub)两种消息...
JMS支持两种类型的消息模型:点对点(Point-to-Point, Queue)和发布/订阅(Publish/Subscribe, Topic)。 在本案例中,我们将深入探讨如何在JBoss ESB中利用JMS Topic实现消息通信。 #### 二、JMS Topic应用场景 ...
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支持两种消息通信模型——**点到点**(Point-to-Point, P2P)和**发布/订阅**(Publish/Subscribe, Pub/Sub)。这两种模型分别适用于不同的场景: - **点到点模型**:在这种模型下,消息由发送...
JMS 支持两种消息通信模型:点到点(point-to-point)(P2P)模型和发布/订阅(Pub/Sub)模型。 点到点模型规定了一个消息只能有一个接收者;发布/订阅模型允许一个消息可以有多个接收者。在点到点模型中,消息生产...
WebLogic Server是一款由Oracle公司提供的企业级应用服务器,它支持Java Message Service (JMS) 规范,允许在分布式环境中可靠地发送和接收消息。JMS是Java平台上的标准接口,用于实现应用程序间的异步通信。本文将...
有两种方式接收消息: - **MessageListenerContainer**:通过实现`MessageListener`接口,Spring容器会自动启动监听线程,接收到消息后调用监听器方法。 - **JmsTemplate.receive()**:阻塞式接收,调用后会等待直到...
在Spring框架中,消息队列(Message Queue,简称MQ)是一种重要的组件,它允许应用程序之间进行异步通信,提高系统的可扩展性和解耦性。在本主题中,我们将深入探讨如何在Spring环境下实现基于Queue的通信以及持久...
- **消息服务体系结构**:JMS定义了两种主要的消息传送模型——点对点(Point-to-Point, PTP)和发布/订阅(Publish/Subscribe, Pub/Sub)模型。 - **消息传送模型对照表**:PTP模式使用Queue,消息只能被一个消费...
它支持两种消息模型:点对点(Queue)和发布/订阅(Topic)。点对点模型中,消息由一个生产者发送到一个队列,一个消费者接收并处理该消息;发布/订阅模型中,消息被发布到一个主题,多个订阅者可以接收。 **二、...
首先,我们要理解JMS中的两种主要概念:Queue(队列)和Topic(主题)。Queue遵循点对点模型,每个消息只能被一个消费者接收,而Topic遵循发布/订阅模型,允许多个订阅者同时接收到同一消息。在广播订阅场景中,...
2. **消息队列(Queue)** 和 **主题(Topic)**:是两种消息目的地类型。消息队列遵循“先进先出”(FIFO)原则,每个消息只有一个消费者;而主题支持发布/订阅模式,一个消息可以被多个订阅者消费。 3. **消息...
JMS中包含两个主要对象:Message和Destination。Message是数据载体,包含了要传递的信息,可以是文本、二进制数据或特定的JMS对象。Destination是消息的目标,可以是队列(Queue)或主题(Topic)。 JMS提供两种...