Java 具有多线程的RabbitMQ RPC生成器

Java 具有多线程的RabbitMQ RPC生成器,java,rabbitmq,Java,Rabbitmq,如何在多线程环境中实现RPC调用? 在这里的基础教程:,在多线程环境中,我看到两个问题: -如果所有线程都在不同的线程中(包括构造函数),我们将为每个线程创建一个回复队列,我认为这不是一个好主意(否?) -如果只有fibonacciRpc.call(“4”)在不同的线程中,则应答队列的使用者可以使用错误的应答,而此应答的原始使用者将无限期等待 目前我还没有找到任何解决方案,但可能是因为我不明白一些事情。在我的情况下: channel.basicConsume(replyQueueName,tru

如何在多线程环境中实现RPC调用? 在这里的基础教程:,在多线程环境中,我看到两个问题:

-如果所有线程都在不同的线程中(包括构造函数),我们将为每个线程创建一个回复队列,我认为这不是一个好主意(否?)

-如果只有fibonacciRpc.call(“4”)在不同的线程中,则应答队列的使用者可以使用错误的应答,而此应答的原始使用者将无限期等待

目前我还没有找到任何解决方案,但可能是因为我不明白一些事情。

在我的情况下: channel.basicConsume(replyQueueName,true,newdefaultconsumer(channel){}在内存中造成大量堆大小,只要我不删除通道,它就不会被清除

根据Internet,您应该创建一个连接。 在读取响应后,为每个线程创建通道,为每个通道创建单独的队列,并删除队列,如果不这样做,它将在同一通道中不断创建新队列

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

看来要解决这个问题,我必须删除频道。

在我的情况下: channel.basicConsume(replyQueueName,true,newdefaultconsumer(channel){}在内存中造成大量堆大小,只要我不删除通道,它就不会被清除

根据Internet,您应该创建一个连接。 在读取响应后,为每个线程创建通道,为每个通道创建单独的队列,并删除队列,如果不这样做,它将在同一通道中不断创建新队列

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


看起来要解决这个问题,我必须删除通道。

在这个例子中,每个线程都应该有一个独立的、暂时的回复队列。你认为这会是一个问题吗?我的应用程序是一个web应用程序,可能同时有很多请求,因此,大量创建和删除回复队列。我不明白的是示例是“关联id”,因为我们为每个RPC请求创建了一个队列,所以“关联id”的检查是不必要的,回复队列中的消息必然是针对请求的。如果队列是针对多个请求的,那么我们就在第二个队列中,也许我的错误是我的英语不好……好吧,我不是RabbitMQ的专家,但我的理解是,回复队列是暂时的,换句话说,它不需要持久,这意味着它只是一个memory队列,因此创建速度应该相当快。此外,回复队列是针对每个使用者的,而不是针对每个请求的,这意味着每个线程都与一个使用者相对应,如果您的线程/使用者发出多个请求,则所有线程都可以通过相同的回复队列,在这种情况下,需要相关ID来确定哪个请求拥有answer。在这个例子中,每个线程都应该有一个独立的、暂时的回复队列。为什么你认为这会是一个问题?我的应用程序是一个web应用程序,可能同时有很多请求,因此,大量创建和删除回复队列。在这个例子中,我不理解的是“相关id”,因为我们为每个RPC请求创建了一个队列,所以“相关id”的检查是不必要的,回复队列中的消息必然是针对请求的。如果队列是针对多个请求的,那么我们就在第二个队列中,也许我的错误是我的英语不好……好吧,我不是RabbitMQ的专家,但我的理解是,回复队列是暂时的,换句话说,它不需要持久,这意味着它只是一个memory队列,因此创建速度应该相当快。此外,回复队列是针对每个使用者的,而不是针对每个请求的,这意味着每个线程都与一个使用者相对应,如果您的线程/使用者发出多个请求,则所有线程都可以通过相同的回复队列,在这种情况下,需要相关ID来确定哪个请求拥有a回答。