![](/img/trans.png)
[英]inter-thread communication between java application and jax-ws web service
[英]inter thread communication between java web application and web service
我在Java应用程序和jax-ws Web服务之间的线程间通信中发布的原始问题的某些前提发生了变化(我也在简化该问题,以使其更易于理解(并因此得到回答)...希望主持人可以)
Web服务线程(THREAD-1)在套接字上发出请求,然后进入睡眠状态以等待响应。 另一个侦听器线程(THREAD-2)(一旦收到响应,就作为单独的Web应用程序运行)必须将THREAD-1唤醒。
我该怎么做(以推送通知的方式)?
他们俩都可以访问数据库表。 THREAD-1可以在睡觉之前将其唯一的ID放在表中。 THREAD-2,一旦收到响应并确定它属于THREAD-1,就更新数据库表中的相应行。 现在,THREAD-1可以(定期)对数据库表进行轮询,以检查响应是否到达。
但我希望以推送通知的方式进行。 响应到达时应立即通知THREAD-1,而不必每隔几秒钟轮询一次。
如果您的后端请求很快完成,并且您将没有大量的客户端请求要处理,则可以让Web服务在刚刚打开的同一套接字上等待响应。 它可以阻止等待读取响应。
但是,如果可以访问Servlet 3.0(例如Tomcat 7),则可以使用异步HTTP请求 。 它允许您将处理Web服务客户端的线程释放回池中,而无需响应客户端的请求。 当响应消息从后端服务到达时,抓取将从servlet容器中获取适当的Web服务客户端请求,并将最终响应发送回Web服务客户端。
好吧,正如评论所建议的那样:最好不要尝试自己实现这一点。 但是,基本上,您可以将标准Java线程同步与wait()/ notify()结合使用
wait()
(而不是sleep()
) notifyAll()
唤醒所有等待的线程 wait()
,它们将继续工作。 线程1端的伪代码:
HashMap<String, Object> results;
// Called by Thread-1 to access Thread-2
public void doIt() {
String callId = "aUniqueCallId";
Object result = null;
remoteCallToThread2(callId);
synchronized(results) {
while((result = results.remove(callId)) == null) {
results.wait();
}
}
doSomethingWith(result);
}
// Called remotely by Thread-2 when result is available
public void callback(String callId, Object result) {
synchronized(results) {
results.put(callId, result);
results.notifyAll();
}
}
当然,这只是基本思想,不能被如此使用,这里有很多东西要考虑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.