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

时间:2012-07-13 21:18:23

标签: java multithreading web-services jax-ws

我的jax-ws Web服务(在被客户端请求命中之后),向后端旧版平台发送请求(通过套接字),然后等待20秒以进行响应。

在发出请求之前,它会使用其唯一的交易号更新表格。

一个单独的侦听器线程(独立的Java应用程序)正在该套接字上等待响应,每个响应都将在其中包含事务编号,以标识与其关联的请求(先前已发送)。

这个独立的Java应用程序如何与在Web服务中等待其响应的线程进行通信,并且可以继续进行处理。

目前我认为侦听器线程可以更新表(基于事务编号)以指示响应已到达。并且Web服务线程可以在数据库中保持轮询(每2秒检查一次)响应是否已到达。

我在这种情况下寻找一些推送通知而不是轮询。如何在响应到达时通知我的Web服务线程。

1 个答案:

答案 0 :(得分:1)

假设服务请求并发出套接字请求的线程和接收套接字响应的线程都在同一个jvm中:
您可以使用标准的Java等待/通知模式 http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

基本上你的req / socket线程会在单例(或类似)地图中创建一个对象(一个'lock'对象),该键是你唯一的交易号。该线程将等待该对象。这会阻塞该线程,直到另一个线程对该事务id的锁定对象进行通知 请注意,锁定对象可以只是一个对象 你也可以在等待时间超时,以免永远等待。

然后,您的其他线程将获取事务ID的锁定对象并对其进行通知。然后解锁第一个线程 如果第二个线程找不到其事务id的锁对象,那么出现了问题,您将不得不记录错误或类似错误。

Ps作为地图是您可能需要ConcurrentHashMap的共享资源。否则,您可能会遇到多个线程同时更新它的问题。