使用JMS方式来实现方法远程调用的实现
由于公司项目需要使用JMS来进行远程方法的调用,即使用了Spring提供的实现来完成。
结果在并发到300左右时总是会出现“慢速消费者”的异常,查看Spring源代码实现看似每次访问都会新建一个会话。结果造成消费积压在JMS服务器上。
只能自己动手,即然是消费者连接太多那就减少消费者吧。在客户端建立一个“响应消息池”来接收远程方法吃应消息,线程发送了调用方法消息之前先在此“响应消息池”注册一下表示需要接收消息然后发送调用的消息。
建立一个MessageConsumer实例,设定为用异步方式接收消费。在接收到消费后根据消息池中是否有注册来决定处理方式。
同注后得到一个“消息探针”,里面用到了java.util.concurrent.CountDownLatch来帮助实现。
客户端线程调用await方法,在远程方法没有返回调用结果之前阻塞。返回结果经由obtainRetunValue方法注入后即结束阻塞。
各位看看,这样实现有没有什么问题。
我测试下来,并发到1700都正常。
结果在并发到300左右时总是会出现“慢速消费者”的异常,查看Spring源代码实现看似每次访问都会新建一个会话。结果造成消费积压在JMS服务器上。
只能自己动手,即然是消费者连接太多那就减少消费者吧。在客户端建立一个“响应消息池”来接收远程方法吃应消息,线程发送了调用方法消息之前先在此“响应消息池”注册一下表示需要接收消息然后发送调用的消息。
建立一个MessageConsumer实例,设定为用异步方式接收消费。在接收到消费后根据消息池中是否有注册来决定处理方式。
同注后得到一个“消息探针”,里面用到了java.util.concurrent.CountDownLatch来帮助实现。
public class MessageProbe {
private Map<String, Serializable> returnValue;
private CountDownLatch latch = new CountDownLatch(1);
public Map<String, Serializable> await() throws InterruptedException {
latch.await();
return returnValue;
}
public Map<String, Serializable> await(long timeout)
throws InterruptedException, TimeoutException {
boolean noTimeout = false;
noTimeout = latch.await(timeout, TimeUnit.MILLISECONDS);
if (noTimeout) {
return returnValue;
} else {
throw new TimeoutException("Response message timed out.");
}
}
public void obtainRetunValue(Map<String, Serializable> value) {
returnValue = value;
latch.countDown();
}
}
客户端线程调用await方法,在远程方法没有返回调用结果之前阻塞。返回结果经由obtainRetunValue方法注入后即结束阻塞。
各位看看,这样实现有没有什么问题。
我测试下来,并发到1700都正常。
...全文
相关推荐
JMS远程调用
标题中的“JMS远程调用”指的是利用JMS来实现在不同系统或进程中进行远程方法调用。这种方式通常涉及将调用请求封装成消息发送到一个消息队列,然后由服务端消费这个消息并执行相应的操作。
26、Spring 远程调用与 JMS 支持详解
本文详细解析了 Spring 框架对远程调用和 JMS 消息服务的支持。涵盖了多种远程调用策略如 Hessian、RMI、JAX-RPC 和 HTTP 调用器的使用场景与配置方式,并深入探讨了 Spring 对 JMS 的集成支持,包括 `JmsTemplate` 的使用、消息转换、异常处理、事务管理以及最佳实践。通过代码示例和流程图,帮助开发者更好地理解如何在实际项目中应用这些技术,实现高效、可靠的企业级应用开发。
远程调用原理
在“JMS_ActiveMQ交流学习_演示文稿”中,可能会详细讲解ActiveMQ作为JMS实现的一种方式,以及如何利用它进行消息传递和远程调用。
远程调用的几种方式.pdf
在分布式服务架构中,远程调用是至关重要的技术,它允许不同节点间的程序协同工作,实现数据交换和服务的解耦。本文将探讨几种常见的远程调用方式,包括它们的原理和应用。首先,我们理解一下远程调用的基本原理。
三种方式实现java远程调用(rmi),绝对可用
### 文件资源在提供的压缩包文件中,"三种方式(原始方式_spring_jndi)实现java远程调用(rmi)"包含了相关的示例代码,帮助开发者理解并实践这三种RMI实现方法。


Java SE
