Java 使用Spring ChannelAwareMessageListener时,如何处理RabbitMQ使用者取消通知

Java 使用Spring ChannelAwareMessageListener时,如何处理RabbitMQ使用者取消通知,java,rabbitmq,amqp,spring-amqp,Java,Rabbitmq,Amqp,Spring Amqp,RabbitMQ新手,Java新手 我正在尝试编写一个监听器,它将使用手动ack,并使用javaspringamqp抽象处理消费者取消通知。我可以通过使用Spring抽象来完成这两项任务吗 我想编写一个监听器,从队列中提取消息并处理该消息(可能写入数据库或其他东西)。我计划使用手动确认,这样,如果消息处理失败或由于某种原因无法完成,我可以拒绝并重新请求。到目前为止,我认为我已经发现,为了使用Spring AMQP手动确认/确认/拒绝,我必须使用ChannelAwareMessageListene

RabbitMQ新手,Java新手

我正在尝试编写一个监听器,它将使用手动ack,并使用javaspringamqp抽象处理消费者取消通知。我可以通过使用Spring抽象来完成这两项任务吗

我想编写一个监听器,从队列中提取消息并处理该消息(可能写入数据库或其他东西)。我计划使用手动确认,这样,如果消息处理失败或由于某种原因无法完成,我可以拒绝并重新请求。到目前为止,我认为我已经发现,为了使用Spring AMQP手动确认/确认/拒绝,我必须使用
ChannelAwareMessageListener

我意识到我应该处理来自RabbitMQ的消费者取消通知,但是使用
ChannelAwareMessageListener
我真的没有找到为此编写代码的方法。处理CCN的唯一方法是使用较低级别的java客户端api编写代码,方法是调用
channel.basicConsume()
并传递一个新的
DefaultConsumer
实例,该实例允许您处理消息传递和取消

我也不知道如何在
ConnectionFactory
上设置
clientProperties
(告诉代理我可以处理CCN),因为我从配置中的bean获取工厂

下面是我的侦听器和容器创建的伪代码

public class MyChannelAwareListener implements ChannelAwareMessageListener
{
    @Override
    public void onMessage(Message message, Channel channel) throws Exception
    {
        msgProcessed = processMessage(message);

        if(msgProcessed)    
           channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        else
           channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);  
    }
}

public static void main(String[] args) throws Exception
{
    ConnectionFactory rabbitConnectionFactory;
    ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext   (MY_CONTEXT_PATH);
    rabbitConnectionFactory = (ConnectionFactory)ctx.getBean("rabbitConnectionFactory");

    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();

    MyChannelAwareListener listener = new MyChannelAwareListener();
    container.setMessageListener(listener);
    container.setQueueNames("myQueue");
    container.setConnectionFactory(rabbitConnectionFactory);
    container.setAcknowledgeMode(AcknowledgeMode.MANUAL);
    container.start();
}

要设置客户端属性,需要使用
ConnectionFactory
中的
setClientProperties
方法(假设此ConnectionFactory是RabbitMQ Java库中的对象)。此方法需要一个
映射
,其中包含客户端的属性和功能。以下几行是RabbitMQ Java库中的默认值:

Map<String,Object> props = new HashMap<String, Object>();
props.put("product", LongStringHelper.asLongString("RabbitMQ"));
props.put("version", LongStringHelper.asLongString(ClientVersion.VERSION));
props.put("platform", LongStringHelper.asLongString("Java"));
props.put("copyright", LongStringHelper.asLongString(Copyright.COPYRIGHT));
props.put("information", LongStringHelper.asLongString(Copyright.LICENSE));

Map<String, Object> capabilities = new HashMap<String, Object>();
capabilities.put("publisher_confirms", true);
capabilities.put("exchange_exchange_bindings", true);
capabilities.put("basic.nack", true);
capabilities.put("consumer_cancel_notify", true);

props.put("capabilities", capabilities);
Map props=newhashmap();
props.put(“产品”,LongStringHelper.asLongString(“RabbitMQ”);
props.put(“version”,LongStringHelper.asLongString(ClientVersion.version));
props.put(“平台”,LongStringHelper.asLongString(“Java”);
props.put(“版权”,LongStringHelper.asLongString(版权.版权));
props.put(“信息”,LongStringHelper.asLongString(版权.许可证));
映射能力=新的HashMap();
能力。put(“发布者确认”,true);
put(“交换绑定”,true);
capabilities.put(“basic.nack”,true);
能力。put(“消费者取消通知”,true);
道具放置(“能力”,能力);
对于管理ACK和消费者取消,我不知道如何使用Spring AMQP抽象实现,但是使用
channel.basicConsume
是完全可行的,它使您能够通过所有回调方法处理所有场景:

希望这有帮助