activeMQ 消费者问题
问题如下:发布者发布了一个消息到一个topic,但是订阅者现在还没有订阅,当我启动订阅者时,如何去接收该消息呢,意思就是消息比订阅者先出现,请问如何解决这个问题?...
问题如下:发布者发布了一个消息到一个topic,但是订阅者现在还没有订阅,当我启动订阅者时,如何去接收该消息呢,意思就是消息比订阅者先出现,请问如何解决这个问题?
展开
3个回答
展开全部
ActiveMQ服务器消费者:从消息服务接收消息。
1、 ActiveMQ服务器工作模式:通过ActiveMQ消息服务交换消息。消息生产者将消息发送至消息服务,消息消费者则从消息服务接收这些消息。这些消息传送操作是使用一组实现 ActiveMQ应用编程接口 (API) 的对象来执行的。
2、 ActiveMQ客户端使用 ConnectionFactory 对象创建一个连接,向消息服务发送消息以及从消息服务接收消息均是通过此连接来进行。Connection 是客户端与消息服务的活动连接。创建连接时,将分配通信资源以及验证客户端。这是一个相当重要的对象,大多数客户端均使用一个连接来进行所有的消息传送。 连接用于创建会话。Session 是一个用于生成和使用消息的单线程上下文。它用于创建发送的生产者和接收消息的消费者,并为所发送的消息定义发送顺序。会话通过大量确认选项或通过事务来支持可靠传送。 客户端使用 MessageProducer 向指定的物理目标(在 API 中表示为目标身份对象)发送消息。生产者可指定一个默认传送模式(持久性消息与非持久性消息)、优先级和有效期值,以控制生产者向物理目标发送的所有消息。
3、客户端使用 MessageConsumer 对象从指定的物理目标(在 API 中表示为目标对象)接收消息。消费者可使用消息选择器,借助它,消息服务可以只向消费者发送与选择标准匹配的那些消息。 消费者可以支持同步或异步消息接收。异步使用可通过向消费者注册 MessageListener 来实现。当会话线程调用 MessageListener 对象的 onMessage 方法时,客户端将使用消息。
1、 ActiveMQ服务器工作模式:通过ActiveMQ消息服务交换消息。消息生产者将消息发送至消息服务,消息消费者则从消息服务接收这些消息。这些消息传送操作是使用一组实现 ActiveMQ应用编程接口 (API) 的对象来执行的。
2、 ActiveMQ客户端使用 ConnectionFactory 对象创建一个连接,向消息服务发送消息以及从消息服务接收消息均是通过此连接来进行。Connection 是客户端与消息服务的活动连接。创建连接时,将分配通信资源以及验证客户端。这是一个相当重要的对象,大多数客户端均使用一个连接来进行所有的消息传送。 连接用于创建会话。Session 是一个用于生成和使用消息的单线程上下文。它用于创建发送的生产者和接收消息的消费者,并为所发送的消息定义发送顺序。会话通过大量确认选项或通过事务来支持可靠传送。 客户端使用 MessageProducer 向指定的物理目标(在 API 中表示为目标身份对象)发送消息。生产者可指定一个默认传送模式(持久性消息与非持久性消息)、优先级和有效期值,以控制生产者向物理目标发送的所有消息。
3、客户端使用 MessageConsumer 对象从指定的物理目标(在 API 中表示为目标对象)接收消息。消费者可使用消息选择器,借助它,消息服务可以只向消费者发送与选择标准匹配的那些消息。 消费者可以支持同步或异步消息接收。异步使用可通过向消费者注册 MessageListener 来实现。当会话线程调用 MessageListener 对象的 onMessage 方法时,客户端将使用消息。
展开全部
我有一个假象,首先你得发布者肯定是一个线程。正常情况是订阅者先订阅了topic,当发布者有消息时触发一个final类的消息发布事件。如果你想消息先出现的话你首先在你的final类中必须定义一个临时消息存放的地方。每当你订阅一个消息之前先上这个临时队列里面查看有无信息。有的话触发事件,没有的话什么都不做就可以了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你要先在broker上创建一个持久的订阅者,就能接收订阅者还没启动时的消息了。前提是你的消息是persistent的
//为连接设置唯一的客户端ID
connection.setClientID("zhu");
//创建Topic会话
TopicSession subSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
//创建一个Topic
Topic topic =subSession.createTopic(topicName);
//创建一个订阅者定于Topic
TopicSubscriber subsriber = subSession.createDurableSubscriber(topic , "zhu" );
//为订阅者设置消息监听器
subsriber.setMessageListener(this);
//开启连接
connection.start();
//为连接设置唯一的客户端ID
connection.setClientID("zhu");
//创建Topic会话
TopicSession subSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
//创建一个Topic
Topic topic =subSession.createTopic(topicName);
//创建一个订阅者定于Topic
TopicSubscriber subsriber = subSession.createDurableSubscriber(topic , "zhu" );
//为订阅者设置消息监听器
subsriber.setMessageListener(this);
//开启连接
connection.start();
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
您可能需要的服务
百度律临官方认证律师咨询
平均3分钟响应
|
问题解决率99%
|
24小时在线
立即免费咨询律师
13823人正在获得一对一解答
厦门蝴蝶飞舞1分钟前提交了问题
兰州荒漠之舟2分钟前提交了问题
上海旋风骑士2分钟前提交了问题