使用JMS方式来实现方法远程调用的实现

etnet etnet 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
由于公司项目需要使用JMS来进行远程方法的调用,即使用了Spring提供的实现来完成。

结果在并发到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来实现在不同系统或进程中进行远程方法调用。这种方式通常涉及将调用请求封装成消息发送到一个消息队列,然后由服务端消费这个消息并执行相应的操作。

whdwsl

26、Spring 远程调用与 JMS 支持详解

本文详细解析了 Spring 框架对远程调用和 JMS 消息服务的支持。涵盖了多种远程调用策略如 Hessian、RMI、JAX-RPC 和 HTTP 调用器的使用场景与配置方式,并深入探讨了 Spring 对 JMS 的集成支持,包括 `JmsTemplate` 的使用、消息转换、异常处理、事务管理以及最佳实践。通过代码示例和流程图,帮助开发者更好地理解如何在实际项目中应用这些技术,实现高效、可靠的企业级应用开发。

dapp9builder

远程调用原理

在“JMS_ActiveMQ交流学习_演示文稿”中,可能会详细讲解ActiveMQ作为JMS实现的一种方式,以及如何利用它进行消息传递和远程调用。

weixin_38669628

远程调用的几种方式.pdf

在分布式服务架构中,远程调用是至关重要的技术,它允许不同节点间的程序协同工作,实现数据交换和服务的解耦。本文将探讨几种常见的远程调用方式,包括它们的原理和应用。首先,我们理解一下远程调用的基本原理。

G11176593

三种方式实现java远程调用(rmi),绝对可用

### 文件资源在提供的压缩包文件中,"三种方式(原始方式_spring_jndi)实现java远程调用(rmi)"包含了相关的示例代码,帮助开发者理解并实践这三种RMI实现方法。

mp_ok
评论 1
收藏 已收藏
分享
返回顶部
etnet
Java SE 62,621 成员 307,251 内容