spring + jaxws:有没有比静态变量更好的方法来保持全局状态?

时间:2015-06-18 19:01:36

标签: spring cxf jax-ws

我有一个webservice(cxf),每次调用一个耗时的方法时都会创建一个新的Thread,将一个ID返回给客户端,作为一个令牌传递给另一个web方法来检查特定线程的执行情况状态:

public String doWork(){
    String id = /***randomnly generates an ID****/
    executor.execute(**some runnable**);

   // need to save the guy above
   return id;
}

public String checkStatus(String id){
    /* Here I would basically access to an hashmap
       of tasks, pick the one identified by that ID
       and check its state */
}

正如您在上面所看到的,我的问题是保留对任务的引用,以便我可以跟踪其执行情况。我想出的想法如下:

@Webservice
public class MyService{
    private static HashMap<String, Future> futures = new HashMap<String,Future>();

但是有更好的方法吗?此外这个选择的可能缺点是什么?

2 个答案:

答案 0 :(得分:0)

存储全局状态的另一种方法是使用数据库。不了解您的应用程序的所有细节,唯一想到的是,根据他们如何使用静态变量可能会遇到线程安全问题。

答案 1 :(得分:0)

有助于了解Java EE servlet的底层编程模型,构建JAX-WS等。这个answer解释得很清楚。

要在session期间保留与客户关联的信息,您可以在方法正文中获取会话并在其中存储信息:

Message message = PhaseInterceptorChain.getCurrentMessage();
HttpServletRequest request = (HttpServletRequest)message.get(AbstractHTTPDestination.HTTP_REQUEST);
HttpSession  session = request.getSession(true);
session.setAttribute("id", id);

在后续方法调用中,您可以以相同方式检索会话数据。

一个非常基础(古老)的教程:Maintaining Client State