RabbitMQ 新手和 Java 新手。
我正在尝试编写一个侦听器,它将使用手动确认并使用 java Spring AMQP 抽象处理消费者取消通知。我可以通过使用 Spring 抽象来完成这两项任务吗?
我想编写一个侦听器,它将从队列中提取消息并处理该消息(可能写入数据库或其他东西)。我计划使用手动确认,以便如果消息处理失败或由于某种原因无法完成,我可以拒绝并重新排队。到目前为止,我想我发现为了使用 Spring AMQP 手动确认/拒绝/拒绝,我必须使用ChannelAwareMessageListener
.
我意识到我应该处理来自 RabbitMQ 的消费者取消通知,但是使用ChannelAwareMessageListener
我并没有真正看到为此编写代码的方法。我看到处理 CCN 的唯一方法是使用较低级别的 java 客户端 api 编写代码,方法是调用和传递一个允许您处理消息传递和取消channel.basicConsume()
的新实例。DefaultConsumer
我也看不到如何设置clientProperties
(ConnectionFactory
告诉代理我可以处理 CCN),因为我从 config.xml 中的 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();
}