Java RabbitMQ到BlockingQueue绑定
我正在开发一个多线程应用程序,其中几个“处理器”(线程池中的可运行程序)相互发送消息。它们使用Java RabbitMQ到BlockingQueue绑定,java,queue,rabbitmq,messaging,spring-amqp,Java,Queue,Rabbitmq,Messaging,Spring Amqp,我正在开发一个多线程应用程序,其中几个“处理器”(线程池中的可运行程序)相互发送消息。它们使用BlockingQueue接口进行通信:当处理器A完成任务T1,它将其推送到队列Q1(例如,BlockingQueue如果T1由classMyTask表示);之后,处理器B从Q1中提取任务,执行计算并将结果推送到Q2;等等 我使用LinkedBlockingQueue,因为我的应用程序是单片的,所有处理器都“活”在同一个JVM中。但是,我希望我的应用程序成为模块化(),因此我决定使用RabbitMQ作为
BlockingQueue
接口进行通信:当处理器A
完成任务T1
,它将其推送到队列Q1
(例如,BlockingQueue
如果T1
由classMyTask
表示);之后,处理器B
从Q1
中提取任务,执行计算并将结果推送到Q2
;等等
我使用LinkedBlockingQueue
,因为我的应用程序是单片的,所有处理器都“活”在同一个JVM中。但是,我希望我的应用程序成为模块化(),因此我决定使用RabbitMQ作为消息代理
问题是要从队列的java实现迁移到RabbitMQ,而只需对客户端源代码进行最小的更改。因此,我试图在RabbitMQ抽象和BlockingQueue
接口之间找到某种绑定。因此,当有人向amqp的队列发送消息时,它应该出现在java队列中。反之亦然:当有人将对象推送到java队列时,它应该传播到amqp的交换
下面给出了轮询的示例实现(来自amqp的队列,使用)
<T> BlockingQueue<T> createQueue(Class<T> elementType, MessageListenerContainer listenerContainer) {
LinkedBlockingQueue<T> queue = new LinkedBlockingQueue<>();
MessageConverter messageConverter = listenerContainer.getMessageConverter();
listenerContainer.setupMessageListener((MessageListener) message -> {
Object task = messageConverter.fromMessage(message);
queue.offer(elementType.cast(task));
});
return queue;
}
BlockingQueue createQueue(类elementType,MessageListenerContainer listenerContainer){
LinkedBlockingQueue=新建LinkedBlockingQueue();
MessageConverter MessageConverter=listenerContainer.getMessageConverter();
listenerContainer.setupMessageListener((MessageListener)消息->{
对象任务=messageConverter.fromMessage(消息);
queue.offer(elementType.cast(task));
});
返回队列;
}
到目前为止,我还没有找到一个使用RabbitMQ的队列实现
BlockingQueue
接口的框架。如果这种框架不存在,我的想法在某种程度上是错误的,还是还没有人实现呢 我不确定您是否真的希望按照您描述的方式执行此操作-入站消息将被传递到队列并存储在内存中,而不是RabbitMQ中
我认为一个简单的BlockingQueue
实现,它在下面使用rabbitmplate
从兔子队列中提取消息(使用receive()
,或receiveAndConvert()
)可能更适合于take/poll操作-它会在需要时将消息保留在RabbitMQ中,并简单地rabbitmplate.convertAndSend()
进行提供/输出操作
虽然非常简单,但它可能是对框架的有用补充;考虑到加里的回答,我建议看一下Spring集成框架,它提供了<代码> POLLAMLAMQPhans<代码>:加里,谢谢你的回答。实际上,我指的是那种实现,但我认为它已经存在了。我将考虑在我的项目中集成这个实现之后的贡献(如果在我的情况下Spring集成不起作用)。谢谢,我会尝试Spring集成。第一印象是非常积极的。Gary,最近我意识到
receive()
没有阻塞语义。如我所见,绕过spring amqp并直接使用rabbit客户端实现阻塞行为(扩展)?在中添加了阻塞receive()
。感谢您指出JIRA问题;取而代之的是。