我在inter-thread communication between java application and jax-ws web service中发布的原始问题改变了一些前提(我也简化了问题,使其更容易理解(因此得到答案)......希望主持人可以这样做。)
Web服务线程(THREAD-1)在套接字上发出请求并进入休眠状态等待响应。另一个监听器线程(THREAD-2)(作为单独的Web应用程序运行,一旦收到响应)必须将THREAD-1从睡眠中唤醒。
我该怎么做(以推送通知的方式)?
他们都可以访问数据库表。 THREAD-1可以在它进入睡眠状态之前将其唯一的id放入表中。 THREAD-2,一旦收到响应并确定它属于THREAD-1,它就会更新数据库表中的相应行。现在THREAD-1可以在数据库表上进行轮询(定期)以检查响应是否已到达。
但我希望以推送通知方式进行。当响应到达时,应立即通知THREAD-1,而不必每隔几秒轮询一次。
答案 0 :(得分:3)
如果您的后端请求快速完成并且您没有要处理的客户端请求,您可以让Web服务等待它刚刚打开的同一个套接字的响应。它可以阻止等待阅读响应。
但是,如果您可以访问Servlet 3.0(例如Tomcat 7),则可以使用asynchronous HTTP requests。它允许您将处理Web服务客户端的线程释放回池中,而不响应客户端的请求。当响应消息从后端服务到达时,从servlet容器中获取相应的Web服务客户端请求,并将最终响应发送回Web服务客户端。
答案 1 :(得分:2)
好吧,正如评论所暗示的那样:最好不要试图自己实现。但是,基本上你可以使用标准的Java线程同步与wait()/ notify()
wait()
在同步对象上(而不是sleep()
)notifyAll()
wait()
。Thread-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();
}
}
当然这只是基本的想法,不能这样使用,这里有很多东西需要考虑。