【问题标题】:Pausing and notifying particular threads in a Java Webservice暂停和通知 Java Web 服务中的特定线程
【发布时间】:2011-11-05 10:42:01
【问题描述】:

我正在用 CXF 编写一个 Java 网络服务。我有以下问题:客户端从 Web 服务调用方法。 Web 服务必须并行执行两件事并启动两个线程。其中一个线程需要来自客户端的一些附加信息。调用 webservice 方法时无法添加此信息,因为它依赖于 webservice 中完成的计算。我无法重新设计 Web 服务,因为它是课程作业的一部分,并且作业说明我必须这样做。我想暂停线程并在客户端提供附加信息时通知它。不幸的是,在 Java 中无法通知特定线程。我找不到任何其他方法来解决我的问题。

有什么建议吗?

【问题讨论】:

    标签: java multithreading web-services cxf parallel-processing


    【解决方案1】:

    在考虑了更多之后,我编辑了我的答案

    您有一个相当复杂的架构,如果您的客户端需要来自服务器的信息才能完成请求,那么我认为您需要发布一个或多个“辅助”方法。

    例如,您可以发布(没有所有 Web Service 注释):

    MyData validateMyData(MyData data);
    
    boolean processMyData(MyData data);
    

    然后,客户会根据需要多次拨打validateMyData(),直到它知道自己有完整的信息。服务器可以修改(通过计算、数据库查找或其他方式)MyData 中的变量,以帮助完成信息并将其传递回客户端(用于更新 UI,如果有的话)。

    信息完成后,客户端可以调用processMyData() 来处理完整的请求。

    这样做的好处是可以在不需要后台线程的情况下实现服务器方法,因为它们应该能够使用服务器环境提供的请求线程来完成它们的工作。

    唯一需要注意的是MyData 可能会变得非常大,并且您不想在客户端和服务器之间来回传递它。在这种情况下,您需要提出一个较小的类,其中只包含服务器想要对MyData 进行的更改,并排除不需要更正的数据。

    【讨论】:

      【解决方案2】:

      IMO 很奇怪,Web 服务请求实际上是不完整的。为什么请求不能一次性传递所有信息?我会尝试像这样重新设计您的服务,如果您传递处理请求所需的所有信息,则使其失败。

      编辑:好的,如果您真的必须这样做,那么当您收到第一个请求时,我实际上不会启动新线程。我会存储来自第一个请求的信息(无论是在数据库中还是只是在内存中,如果这只是一个虚拟请求),然后当 第二个 请求进入时,启动线程。

      【讨论】:

      • 我也很想一次性传递所有信息。不幸的是,它不是“真正的”网络服务,而是课程作业的一部分,并且作业说明我必须这样做。
      猜你喜欢
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多