【问题标题】:inter-thread communication between java application and jax-ws web servicejava应用程序和jax-ws web服务之间的线程间通信
【发布时间】:2012-07-13 21:18:22
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java multithreading web-services jax-ws


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我们使用的是内存数据库表,而不是 map,因为它必须存储一个大表(包含许多值得信息的列),而且它必须是可搜索的。现在回到你的建议(我喜欢 - 只是想根据我的需要调整它) - 假设请求线程是一个 Web 服务,第二个线程是一个独立的 Java 应用程序.. 他们仍然可以使用线程等待/通知进行通信模式...
    • 请求线程将由应用服务器管理(作为 Web 服务),第二个线程将是非管理的(作为独立的 Java 应用程序).​​..你看到它们之间的通信有任何问题吗?在这种情况下您建议的模式..
    • 我进行了更多研究,发现了这个链接singztechmusings.wordpress.com/2011/06/20/…,它解释/建议将独立的 Java 应用程序移动到 Web 应用程序。我认为这对我来说是朝着正确方向迈出的一步,这样Web 服务线程(发出请求并正在休眠等待响应的线程)和中断线程(接收响应并完成唤醒休眠线程的工作)都是应用服务器控制下的托管线程
    • 我想知道 Web 应用程序线程唤醒等待某些事件发生的 Web 服务线程的最佳方法是什么。(在这种情况下响应到达)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多