1

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

在发出该请求之前,它会使用其唯一的事务号更新表。

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

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

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

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

4

1 回答 1

1

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

基本上,您的请求/套接字线程将在单例(或类似)映射中创建一个对象(“锁定”对象),键是您的唯一事务号。然后该线程将等待该对象。这会阻塞该线程,直到另一个线程对该事务 id 的锁定对象发出通知。
请注意,锁定对象可以只是一个对象。
您还可以在等待上设置超时以避免永远等待。

然后,您的其他线程将获取事务 id 的锁定对象并对其进行通知。然后这会解除对第一个线程的阻塞。
如果第二个线程没有为它的事务 id 找到锁对象,那么就出了问题,你必须记录一个错误或类似的东西。

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

于 2012-07-13T22:06:09.517 回答