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