我想做这个:
ActiveMQ 向客户端发送消息。
客户端在处理完消息后向 ActiveMQ 发送确认。
如果客户端已关闭,或者没有确认消息,则此消息将保留在队列中。不会传递所有其他消息。
服务器一次发送一条消息,客户端一次处理一条消息。除非第一条消息已被确认,否则不会传递下一条消息。
有没有办法做到这一点?
我想做这个:
ActiveMQ 向客户端发送消息。
客户端在处理完消息后向 ActiveMQ 发送确认。
如果客户端已关闭,或者没有确认消息,则此消息将保留在队列中。不会传递所有其他消息。
服务器一次发送一条消息,客户端一次处理一条消息。除非第一条消息已被确认,否则不会传递下一条消息。
有没有办法做到这一点?
关于失败的缺点,这就是 activeMQ 的工作方式。
如果“失败/错误确认”发生在业务逻辑层,那么您应该使用事务
警告不是有效的代码 (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>
尝试以下...