如果我理解正确的话,一个@ state就可以拯救这个州。如果客户机再次执行请求,则返回到同一个实例。因此,保存类属性是可能的,而在@无状态中则不可能。在这里的另一个线程中,有人写道“它就像一个经典的java实例,每个注入都得到它自己的这个bean的实例”。
但是我不明白请求到@Stateful的映射是如何工作的--它是如何工作的呢?这个问题涉及两种情况:
这个问题不是针对容器/服务器-软件的技术过程,而是针对开发中的具体工作。谢谢您一直鼓励我。
问候
发布于 2015-02-24 13:11:02
不幸的是,这不是web服务的工作方式。有状态bean仅对无状态bean是有状态的。而不是为了一个客户。这是非常危险的原因有几个:
-The无状态bean将调用状态保存在其有状态引用中。但是,无状态bean的下一个调用可以在另一个上下文/由另一个客户端进行。
-The有状态bean可以被容器销毁,而无状态者仍然存在/在池中。
您可以在远程调用或web应用程序中使用有状态bean,但不能在webservices上下文中使用。
webservice是每个定义都没有任何应用程序状态的。Java侦听请求,并从实例池中调用一个无状态bean实现。
如果你真的想要实现有状态的web服务,你必须自己去做。以下示例将在Java 6容器中工作:
/// Client depended values(your statefull bean)
public class SessionValues {
private final List<String> values = new ArrayList<String>();
public void addValue(String s){
values.add(s);
}
public List<String> loadValues(){
return Collections.unmodifiableList(values);
}
}您可以将会话存储在单个实例(您自己的池)中。
@Singleton
@Startup
public class StatefullSingleton {
private final Map<String, SessionValues> sessions = new Hashtable<String, SessionValues>();
@Lock(LockType.READ)
public void addValue(String sessionId, String value) {
if (!sessions.containsKey(sessionId))
sessions.put(sessionId, new SessionValues());
SessionValues p = sessions.get(sessionId);
p.addValue(value);
}
@Lock(LockType.READ)
public List<String> loadValues(String sessionId) {
if (sessions.containsKey(sessionId))
return sessions.get(sessionId).loadValues();
else
return new ArrayList<String>();
}
}并将单例注入无状态webservice bean(池、单例和单例调用由Java容器管理):
@Stateless
@WebService
public class WebserviceBean {
@Inject
private StatefullSingleton ejb;
public void addvalue(String sessionId, String value) {
ejb.addValue(sessionId, value);
}
public List<String> loadValues(String sessionId) {
return ejb.loadValues(sessionId);
}}
上面的例子只是一个模式。如果要在生产中实现会话id和多线程,您必须非常小心。
编辑:删除不必要的@localBean
https://stackoverflow.com/questions/28661016
复制相似问题