我有一个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>();
但是有更好的方法吗?此外这个选择的可能缺点是什么?
答案 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。