使用JMS Topic的发布/订阅式消息发送在几方面类似于点到点的消息发送。以下是两种消息发送方式共同的特点:
•消息发送可以是面向对象的,允许将整个的对象作为消息发送。
•消息发送可以是事务性的。
•消息发送可以是同步或异步的。
•消息发送可以与基础的第三方产品集成。
•消息可以发送给在消息发送时不在运行的消息消费者(即QueueReceiver或TopicSubscriber)。
•消息一旦被递送到队列或主题,发送消息的函数调用就会立即返回。
•可以显式地或自动地确认收到消息。
发布/订阅式消息发送与点到点消息发送之间也有几点不同:
•发布/订阅式消息发送是一对多的,而点到点消息发送是一对一的。
•发布的消息只递送给Topic当前的预订者。客户只能接收到他向一个Topic预订了的那些消息。而在点到点消息发送中,永久的消息将一直在Queue中,直到它超时或者某个接收者来取走该消息。
•发布/订阅式消息发送中的永久消息是由“耐久的预订”提供的。JMS提供者存储由于预订者出于某种原因不可用而无法递送给预订者的消息。在下次预订者连接上的时候,这些存储的消息将会被递送给他。这确保了客户预订一个Topic之后,所有发布的消息都会递送给他,哪怕该预订者不是总在运行。如果预订不是耐久的,在预订者掉线时发布的任何消息都不会递送到预订者。
本文章所描述的QUEUE与TOPIC实现如下:
附件中的jmsproducer压缩包中JAVA工程为生成QUEUE与TOPIC的例子,jmsconsumer压缩包中JAVA工程为消费QUEUE与TOPIC例子。
另外每个工程下LIB目录下的activemq-common.jar为打包的公共类。
在jmsproducer工程中的activemq-producer.xml文件中为持久订阅者提供clientID
配置如下:
<bean id="durableTopicJmsConnectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61617?wireFormat.maxInactivityDuration=0"/>
<property name="clientIDPrefix" value="topicClient"/>
</bean>
clientIDPrefix指定了consumer的clientID的前缀,符合此前缀规则的consumer将成为该TOPIC的持久订阅者。
对应的jmsconsumer工程的TOPIC container配置:
<bean id="topicListenerContainerA"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="durableTopicJmsConnectionFactory" />
<property name="destination" ref="TOPIC" />
<property name="messageListener" ref="topicListenerA" />
<property name="sessionAcknowledgeModeName" value="AUTO_ACKNOWLEDGE"/>
<property name="receiveTimeout" value="20000"/>
<property name="subscriptionDurable" value="true"/>
<property name="clientId" value="topicClientA"/>
<property name="durableSubscriptionName" value="topicClientA" />
</bean>
若将subscriptionDurable设置为ture,则必须提供clientId。
分享到:
相关推荐
在Spring框架中,消息...综上所述,Spring下的Queue和非持久订阅的Topic是两种强大的消息模式,它们可以帮助我们构建高效、可扩展的分布式系统。通过深入学习和实践,我们可以更好地掌握这些技术并应用于实际项目中。
在本示例中,我们将深入探讨如何将Spring框架与ActiveMQ集成,以便实现消息队列(Queue)和主题(Topic)的功能,并确保消息的持久化。ActiveMQ是Apache软件基金会开发的一个开源消息中间件,它支持多种消息协议,如...
在 Pub/Sub 模式下,还可以进一步区分 Nondurable subscription(非持久订阅)和 Durable subscription(持久订阅),后者可以在消费者未处于活动状态时保留消息。 综上所述,Apache ActiveMQ 不仅为开发者提供了...
消费者类(`activeMqConsumer`)则订阅Topic并接收消息: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.annotation.JmsListener; import org.spring...
- Topic支持发布/订阅模型,多个消费者可以订阅同一个Topic,当有新消息发布时,所有订阅者都会收到。 - Topic适用于一对多的消息传递,适合广播式通信,例如通知服务或者日志收集。 6. **配置`application.yml`*...
1. **消息模型**:JMS支持两种主要的消息传递模型——点对点(Queue)和发布/订阅(Topic)。点对点模式中,消息从一个生产者发送到一个队列,然后由一个消费者接收。发布/订阅模式下,消息由发布者发送到主题,多个...
Queue适合点对点通信,而Topic适合发布/订阅模式。 4. 配置JmsTemplate:这是Spring提供的一个工具类,用于简化发送消息的操作。 5. 实现MessageListener:如果需要消费消息,需要创建一个实现了`MessageListener`...
例如,你可以使用`SimpleMessageListenerContainer`的`setSubscriptionDurable()`方法来创建持久订阅,这样即使消费者暂时离线,也不会错过任何消息。 8. **测试和调试**:完成配置后,编写测试用例验证消息的生产...
SpringJMS支持两种消息模型:点对点(Queue)和发布/订阅(Topic)。点对点模型中,每个消息仅由一个消费者接收;而在发布/订阅模型中,消息可以被多个订阅者接收。 7. **消息持久化** SpringJMS和ActiveMQ结合,...
在整合Spring与JMS时,我们首先需要配置`ConnectionFactory`,它是创建与JMS服务器连接的工厂。对于ActiveMQ,我们可以创建一个`ActiveMQConnectionFactory`实例,并设置服务器地址、端口等参数。例如: ```xml ...
本篇文章将深入探讨ActiveMQ的发布/订阅模型(Publish/Subscribe)的实现源码,以及如何与Spring框架进行集成。 首先,我们需要理解ActiveMQ中的发布/订阅模式。在这个模型中,生产者(Publisher)发送消息到一个...
- **消息模型**:JMS定义了两种基本的消息模型——点对点(Queue)和发布/订阅(Topic)。点对点模式下,消息由一个生产者发送到队列,一个消费者接收;发布/订阅模式下,多个消费者可以订阅一个主题,发布者发送的...
本文将深入探讨如何在Spring环境中使用ActiveMQ来实现消息的发送与接收,以提高系统的可扩展性和解耦性。 首先,我们需要了解Spring对ActiveMQ的支持。Spring提供了`spring-jms`模块,它包含了一组丰富的API和配置...
总结,Spring对JMS的支持使得开发者能够在不关注底层细节的情况下,轻松实现消息的发送和接收。通过源码分析和实践,我们可以更深入地理解Spring JMS的工作流程,提升系统设计和开发能力。对于使用Java的企业级应用...
5. **消息模型**:ActiveMQ支持两种基本的消息模型——点对点(Queue)和发布/订阅(Topic)。点对点模式下,每个消息只有一个消费者;发布/订阅模式下,消息可以被多个消费者订阅。 6. **事务和持久化**:Spring和...
4. **定义Destination**:定义消息的目的地,可以是Queue(点对点)或Topic(发布/订阅模型)。 5. **配置MessageListenerContainer**:创建`DefaultMessageListenerContainer`,用于监听消息。可以设置并发消费者...
在JMS中,有两种类型的消息传输机制:点对点(Queue)和发布/订阅(Topic)。队列保证每个消息仅被一个消费者接收,而主题允许多个订阅者接收相同的消息。 6. **事务与持久化**: Spring和ActiveMQ支持事务性消息...
6. **目的地策略**: Spring提供了灵活的方式来定义消息的目标,如Queue和Topic。这些可以通过DestinationResolver或JmsDestinationLookup来实现。 7. **消息驱动的POJO(MDP)**: 通过实现MessageListener接口,你...