2011-11-05 65 views
1

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

有人有建议吗?

回答

1

我已经编辑了我的答案后想到更多

你有一个相当复杂的架构,如果你的客户需要服务器的信息来完成请求,那么我认为你需要发布一个或多个'帮助'方法。

例如,你可以发布(没有所有的Web服务注释):然后

MyData validateMyData(MyData data); 

boolean processMyData(MyData data); 

客户会打电话validateMyData()多次因为它很喜欢,直到它知道它的完整信息。服务器可以修改MyData中的变量(通过计算,数据库查询或其他),以帮助完成信息并将其传回给客户端(用于更新UI,如果有的话)。

一旦信息完成,客户可以拨打processMyData()来处理完整的请求。

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

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

1

海事组织对于一个Web服务请求有效地不完整是很奇怪的。为什么不能一次性传递所有信息?我会尝试重新设计你的服务,并使其失败,如果你通过处理请求所需的所有信息。

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

+0

我也很想一次性传递所有信息。不幸的是,它不是一个“真正的”网络服务,而是一个课程分配和分配的一部分,我必须这样做。 – punkyduck

+0

@punkyduck:好的,编辑... –