我想这样做:
ActiveMQ向客户端发送消息。
客户端在处理完消息后向ActiveMQ发送确认。
如果客户端关闭或未确认该消息,则此消息将保留在队列中。所有其他消息将不会被传递。
服务器一次发送一条消息,客户端一次处理一条消息。除非已确认第一条消息,否则将不会传递下一条消息。
有办法做到这一点吗?
答案 0 :(得分:0)
听起来您正在寻找的是低{0}或prefetch限制与Ack mode客户确认或个人确认相结合的组合。预取零将使您的客户端本质上是基于拉取的消费者,并且如果客户端未能确认在断开连接时已分派的消息,则将ack设置为客户端将导致代理重新传递消息。
答案 1 :(得分:0)
关于失败的缺点,这就是activeMQ的工作方式。
如果业务逻辑层发生“失败/错误确认”,那么您应该使用transactions
警告不是有效代码(pradigm)
// at your Listener
public void onMessage(Message message)
{
if (isValid(message))
{
connection.ack();
commit();
return;
}
rollback();
}
关于邮件限制和持久性,以下目标策略配置将对您有所帮助。
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" producerFlowControl="true" memoryLimit="10mb">
<pendingSubscriberPolicy>
<vmCursor />
</pendingSubscriberPolicy>
</policyEntry>
<policyEntry queue=">" producerFlowControl="true" memoryLimit="10mb">
<pendingQueuePolicy>
<vmQueueCursor/>
</pendingQueuePolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
恕我直言,我也会使用MySQL来实现这种持久性
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#mysql-ds"/>
</persistenceAdapter>
答案 2 :(得分:0)
尝试以下方法......