2017-03-09 85 views
0

我怎样在多线程环境中实现RPC调用? 在基本教程这里:https://www.rabbitmq.com/tutorials/tutorial-six-java.html,在多线程环境在,我看到了两个问题:带多线程的RabbitMQ RPC生成器

- 如果所有的都在不同的线程(含构造函数),我们为每个线程创建应答队列,我没有事情是一个好主意(不是?)

- 如果只有fibonacciRpc.call(“4”)在不同的线程中,则回复队列的使用者可以使用不良回复,并且此回复的原始使用者将无限期地等待。

我现在没有找到任何解决方案,但也许我不明白的东西。

+0

在这个例子中,每个线程应该有一个独立的瞬态答复队列。你为什么认为这会是一个问题? –

+0

我的应用程序是一个web应用程序,可能同时有很多请求,所以大量创建和删除回复队列。 我在示例中不理解的是“Correlation id”,因为我们为每个RPC请求创建了一个队列,所以“correlation id”的检查是不必要的,对于请求来说,回复队列中的消息不可避免。如果排队是几个请求,我们在我的第二秒 也许我的错误是我的英语不好...... – Charles

+0

嗯,我不是RabbitMQ的专家,但我的理解是,答复队列是短暂的,在换句话说,它不需要持久化,这意味着它只是一个内存队列,因此创建速度应该很快。此外,答复队列是按消费者而不是每个请求的,这意味着每个线程都与消费者相对应,如果线程/消费者发出多个请求,则所有人都可以通过相同的答复队列,在这种情况下,需要确定相关ID以确定哪个请求拥有答案。 –

回答

0

在我的情况: channel.basicConsume(replyQueueName,真实,新DefaultConsumer(信道){}导致堆大小的很多记忆,并没有得到,只要我不删除通道清除

根据互联网,你应该创建一个连接 为每个线程创建通道,并在读取响应后为每个通道创建单独的队列并删除队列,如果不需要它会一直创建新的队列,同一个频道

但是新的DefaultConsumer正在创建大量的堆内存

看起来像摆脱这我必须删除频道。