Jms 获取MessageConsumed的ActiveMQ咨询消息时出现问题
我需要能够在ActiveMQ客户端使用MQTT消息时接收通知 activemq.xmlJms 获取MessageConsumed的ActiveMQ咨询消息时出现问题,jms,activemq,spring-jms,Jms,Activemq,Spring Jms,我需要能够在ActiveMQ客户端使用MQTT消息时接收通知 activemq.xml <destinationPolicy> <policyMap> <policyEntries> <policyEntry topic=">" advisoryForConsumed="true" /> </policyEntries> </policyMap> <
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" advisoryForConsumed="true" />
</policyEntries>
</policyMap>
</destinationPolicy>
我做错了什么
我还尝试使用ActiveMQ BrokerFilter执行此操作:
public class AMQMessageBrokerFilter extends GenericBrokerFilter {
@Override
public void acknowledge(ConsumerBrokerExchange consumerExchange, MessageAck ack) throws Exception {
super.acknowledge(consumerExchange, ack);
}
@Override
public void postProcessDispatch(MessageDispatch messageDispatch) {
Message message = messageDispatch.getMessage();
}
@Override
public void messageDelivered(ConnectionContext context, MessageReference messageReference) {
log.debug("messageDelivered called.");
super.messageDelivered(context, messageReference);
}
@Override
public void messageConsumed(ConnectionContext context, MessageReference messageReference) {
log.debug("messageConsumed called.");
super.messageConsumed(context, messageReference);
}
在第二个场景中,我无法同时拥有用于发送已使用通知的消息和上下文。acknowledge/messageDelivered/messageConsumed都有一个连接上下文,但只有postProcessDispatch有我需要的部分消息(负载是JSON),以便发送我的传出消息。我可以急切地使用send,它同时具有这两种功能,但更安全的做法是等待至少它被确认
我试过:
@Override
public void postProcessDispatch(MessageDispatch messageDispatch) {
super.postProcessDispatch(messageDispatch);
String topic = messageDispatch.getDestination().getPhysicalName();
if( topic == null || topic.equals("delivered") )
return;
try {
ActiveMQTopic responseTopic = new ActiveMQTopic("delivered");
ActiveMQTextMessage responseMsg = new ActiveMQTextMessage();
responseMsg.setPersistent(false);
responseMsg.setResponseRequired(false);
responseMsg.setProducerId(new ProducerId());
responseMsg.setText("Delivered msg: "+msg);
responseMsg.setDestination(responseTopic);
String messageKey = ":"+rand.nextLong();
MessageId msgId = new MessageId(messageKey);
responseMsg.setMessageId(msgId);
ProducerBrokerExchange producerExchange=new ProducerBrokerExchange();
ConnectionContext context = getAdminConnectionContext();
producerExchange.setConnectionContext(context);
producerExchange.setMutable(true);
producerExchange.setProducerState(new ProducerState(new ProducerInfo()));
next.send(producerExchange, responseMsg);
}
catch (Exception e) {
log.debug("Exception: "+e);
}
然而,上述情况似乎会导致服务器不稳定。我认为这与使用getAdminConnectionContext有关,这似乎是错误的。我的工厂在默认情况下将setPubSubDomain设置为false。这将禁用主题的建议消息连接。我把它设为真,事情就开始了。请注意,队列将无法使用此集合。为了解决这个问题,我创建了两个工厂,并给它们的豆子命名
@Bean(name="main")
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
// factory.setDestinationResolver(destinationResolver);
// factory.setPubSubDomain(true);
factory.setConcurrency("3-10");
return factory;
}
@Bean(name="main")
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
// factory.setDestinationResolver(destinationResolver);
// factory.setPubSubDomain(true);
factory.setConcurrency("3-10");
return factory;
}