java Web应用程序和Web服务之间的线程间通信

时间:2012-07-14 17:23:18

标签: java multithreading web-services jax-ws

我在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,而不必每隔几秒轮询一次。

2 个答案:

答案 0 :(得分:3)

如果您的后端请求快速完成并且您没有要处理的客户端请求,您可以让Web服务等待它刚刚打开的同一个套接字的响应。它可以阻止等待阅读响应。

但是,如果您可以访问Servlet 3.0(例如Tomcat 7),则可以使用asynchronous HTTP requests。它允许您将处理Web服务客户端的线程释放回池中,而不响应客户端的请求。当响应消息从后端服务到达时,从servlet容器中获取相应的Web服务客户端请求,并将最终响应发送回Web服务客户端。

答案 1 :(得分:2)

好吧,正如评论所暗示的那样:最好不要试图自己实现。但是,基本上你可以使用标准的Java线程同步与wait()/ notify()

  • Thread-1对Thread-2的远程调用以及唯一的call-ID。
  • Thread-1现在wait()在同步对象上(而不是sleep()
  • Thread-2完成工作并返回结果,它调用JVM中的一些远程回调方法,Thread-1驻留在 - call-ID与结果一起传递
  • Thread-1端的回调方法通过call-ID使结果可用,并通过notifyAll()
  • 唤醒所有等待的线程
  • 线程包括线程1检查他们的结果是否到达,如果是,他们会继续工作,如果没有再次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();
    } 
}

当然这只是基本的想法,不能这样使用,这里有很多东西需要考虑。