Jms 获取MessageConsumed的ActiveMQ咨询消息时出现问题

Jms 获取MessageConsumed的ActiveMQ咨询消息时出现问题,jms,activemq,spring-jms,Jms,Activemq,Spring Jms,我需要能够在ActiveMQ客户端使用MQTT消息时接收通知 activemq.xml <destinationPolicy> <policyMap> <policyEntries> <policyEntry topic=">" advisoryForConsumed="true" /> </policyEntries> </policyMap> <

我需要能够在ActiveMQ客户端使用MQTT消息时接收通知

activemq.xml

<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;
    }