Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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 如何在web上下文中设置RabbitMQ RPC RabbitMQ RPC_Java_Tomcat_Rabbitmq_Rpc - Fatal编程技术网

Java 如何在web上下文中设置RabbitMQ RPC RabbitMQ RPC

Java 如何在web上下文中设置RabbitMQ RPC RabbitMQ RPC,java,tomcat,rabbitmq,rpc,Java,Tomcat,Rabbitmq,Rpc,我决定使用RabbitMQ RPC,如上所述 我的设置 传入的web请求(在Tomcat上)将通过RabbitMQ向不同的服务发送RPC请求,并汇总结果。我使用一个回复队列和一个自定义使用者,侦听所有RPC响应,并在一个简单的哈希映射中使用它们的相关id收集它们。没什么特别的。 这在控制器级的简单集成测试中非常有效 问题 当我在部署在Tomcat上的web项目中尝试这样做时,Tomcat拒绝关闭。jstack和一些调试告诉我一个线程是用来监听RPC响应的,并且阻止Tomcat正常关闭。我猜这是因

我决定使用RabbitMQ RPC,如上所述

我的设置 传入的web请求(在Tomcat上)将通过RabbitMQ向不同的服务发送RPC请求,并汇总结果。我使用一个回复队列和一个自定义使用者,侦听所有RPC响应,并在一个简单的哈希映射中使用它们的相关id收集它们。没什么特别的。 这在控制器级的简单集成测试中非常有效

问题 当我在部署在Tomcat上的web项目中尝试这样做时,Tomcat拒绝关闭。jstack和一些调试告诉我一个线程是用来监听RPC响应的,并且阻止Tomcat正常关闭。我猜这是因为创建的线程是在应用程序级别而不是请求级别创建的,并且不是由Tomcat管理的。当我在
Servlet.destroy()
ServletContextListener.contextDestroyed(ServletContextEvent sce)
中设置断点时,无法到达断点,因此我无法手动清理

可供替代的 作为替代方案,我可以为每个web请求使用一个新的回复队列(和简单的QueueingConsumer)。我已经测试过了,它可以正常工作,Tomcat也可以正常关机。但是我想知道这是不是一条路。。RabbitMQ集群能否处理数千(甚至数百万)的短生命队列/消费者?我可以想象排队的人没有那么多,但是。。不断向所有群集节点广播。。总内存占用

问题:
简而言之,为每个传入的web请求创建一个队列是明智的吗?或者我应该如何使用一个队列和使用者设置RabbitMQ,以便Tomcat可以正常关机?

我找到了解决问题的方法:

Java客户端正在创建自己的线程。在创建新连接时,可以添加您自己的
ExecutorService
。在
ServletContextListener.initialized()
方法中执行此操作,可以跟踪
ExecutorService
,并在
ServletContextListener.destromed()
方法中手动关闭它

executorService.shutdown();
executorService.awaitTermination(20, TimeUnit.SECONDS);
我使用了
Executors.newCachedThreadPool()因为线程有许多短执行,当空闲超过60秒时,它们会被清除


这是RabbitMQ Google组线程的最新版本(感谢Michael Klishin为我指明了正确的方向)

我找到了解决问题的方法:

Java客户端正在创建自己的线程。在创建新连接时,可以添加您自己的
ExecutorService
。在
ServletContextListener.initialized()
方法中执行此操作,可以跟踪
ExecutorService
,并在
ServletContextListener.destromed()
方法中手动关闭它

executorService.shutdown();
executorService.awaitTermination(20, TimeUnit.SECONDS);
我使用了
Executors.newCachedThreadPool()因为线程有许多短执行,当空闲超过60秒时,它们会被清除


这是RabbitMQ Google组线程的最新版本(感谢Michael Klishin为我指明了正确的方向)

我刚刚在Java RabbitMQ jar中发现了提供的
RpcClient
RpcServer
。即使使用这些,Tomcat也没有正常关闭。我只是在Java RabbitMQ jar中发现了提供的
RpcClient
RpcServer
。即使使用这些,Tomcat也不能正常关闭。