Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RabbitMQ到BlockingQueue绑定_Java_Queue_Rabbitmq_Messaging_Spring Amqp - Fatal编程技术网

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
由class
MyTask
表示);之后,处理器
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问题;取而代之的是。