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

etnet 2010-04-30 03:33:50
由于公司项目需要使用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都正常。
...全文
97 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
临远 2010-04-30
  • 打赏
  • 举报
回复
jms的远程方法调用啊。国外有个Lingo项目就是做这个的。

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧