繁体   English   中英

Java Web应用程序与Web服务之间的线程间通信

[英]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()结合使用

  • 线程1对线程2的远程调用集以及唯一的调用ID。
  • 线程1现在在同步对象上执行了wait() (而不是sleep()
  • 线程2进行工作,并返回结果,它在JVM线程1中驻留了一些远程回调方法-调用ID与结果一起传递
  • Thread-1端的回调方法使结果可通过call-ID获得,并通过notifyAll()唤醒所有等待的线程
  • 含螺纹 线程1检查其结果是否到达,如果是,则再次继续执行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM