在从动态队列(ActiveMQ)读取消息时(Pending Messages = 1000),我已经确认了每条消息,现在消息的数量= 1000。
有没有办法将所有出列的消息再次放入Queue。 任何解决方案都可以实时备份所有邮件。
提前致谢
答案 0 :(得分:0)
一旦经纪人从消费者那里得到确认,它就会从经纪人的持久性存储[KahaDB /数据库按配置]中删除消息。
因此,如果您已将所有消息从队列发送到另一个队列或代理,则可以将这些消息重新发送到原始队列。但是,所有这些都取决于您对消息所做的如果您使用MDB / Java代码等消耗它,您将无法再将它们放置到原始队列中。
答案 1 :(得分:0)
在activemq中可以看到未设计的出列消息,您需要自己的逻辑将它们保存在其他位置。
ActivemMQ还提供了一些功能,使其更容易,如镜像队列(http://activemq.apache.org/mirrored-queues.html)或日志插件。
但您仍然需要在其他地方保存邮件并自行备份。
答案 2 :(得分:0)
在需要邮件正文时备份已排队的邮件:
您可以将其添加到 activemq.xml
这会将邮件副本保存到${activemq.base}/bin/data/activemq/
下的文件中
按天和队列的文件
<bean id="ActiveMQVMConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="vm://localhost?create=false&waitForStart=10000"/>
<property name="userName" value="${activemq.username}"/>
<property name="password" value="${activemq.password}"/>
</bean>
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent" >
<property name="connectionFactory" ref="ActiveMQVMConnectionFactory"/>
</bean>
<camelContext id="camel" trace="false" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="activemq:queue:*?mapJmsMessage=false&selector=CamelFileNameProduced IS NULL" />
<choice>
<when>
<simple>${in.headers.CamelFileNameProduced} == null</simple>
<setHeader headerName="CamelJmsDestinationName">
<simple>${in.header.JMSDestination.physicalName}</simple>
</setHeader>
<transform>
<simple>${in.body}\n</simple>
</transform>
<to uri="file://data/activemq/?fileExist=Append&fileName=routeMessages-${in.header.JMSDestination.physicalName}-${date:now:yyyyMMdd}.txt" />
<to uri="activemq:dummy" />
</when>
</choice>
</route>
</camelContext>
如果您只需要元数据:
Destination advisoryDestination = session.createTopic("ActiveMQ.Advisory.MessageConsumed.>");
MessageConsumer consumer = session.createConsumer(advisoryDestination);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message msg) {
System.out.println(msg);
System.out.println(((ActiveMQMessage) msg).getMessageId());
}
});