![](/img/trans.png)
[英]Implement Request-Reply pattern using ActiveMQ, Camel and Spring
[英]How to implement blocking request-reply using Java concurrency primitives?
我的系统由一个“代理”类组成,它接收“请求”数据包,编组它们并通过网络将它们发送到服务器,服务器解组它们,处理并返回一些“响应数据包”。
代理端的“提交”方法应该阻止,直到收到请求的回复(数据包有ID用于标识和引用)或者直到达到超时。
如果我在Java的早期版本中构建它,我可能会在我的代理中实现一个“挂起的消息ID”的集合,我将在其中提交消息,并在相应的id(具有超时)上wait()。 收到回复后,处理线程会通知()相应的id。
有没有更好的方法来使用现有的库类来实现这一点,可能是在java.util.concurrency中?
如果我使用上述解决方案,在调用wait()之前,处理潜在竞争条件的正确方法是什么?
简单的方法是让Callable与服务器通信并返回Response。
// does not block
Future<Response> response = executorService.submit(makeCallable(request));
// wait for the result (blocks)
Response r = response.get();
管理请求队列,为请求分配线程以及通知客户端代码都被实用程序类隐藏。
并发级别由执行程序服务控制。 每个网络调用都阻塞一个线程。
为了更好的并发性,人们也可以考虑使用java.nio(但是因为你正在与所有请求的同一服务器通信,所以固定数量的并发连接,甚至可能只有一个,似乎就足够了)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.