首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >映射WebService-客户端-访问@Stateful

映射WebService-客户端-访问@Stateful
EN

Stack Overflow用户
提问于 2015-02-22 17:40:18
回答 1查看 350关注 0票数 0

如果我理解正确的话,一个@ state就可以拯救这个州。如果客户机再次执行请求,则返回到同一个实例。因此,保存类属性是可能的,而在@无状态中则不可能。在这里的另一个线程中,有人写道“它就像一个经典的java实例,每个注入都得到它自己的这个bean的实例”。

但是我不明白请求到@Stateful的映射是如何工作的--它是如何工作的呢?这个问题涉及两种情况:

  1. 我通过客户端软件调用webservice @Stateful。这是我要寄的身份证吗?但是,ID是什么,容器如何知道这是标识-attribut,并将其路由到正确的@Stateful?
  2. 我从一个@无状态的bean中调用“状态”。例如,如果客户端首先调用@无状态bean并被重定向到他的@Stateless。

这个问题不是针对容器/服务器-软件的技术过程,而是针对开发中的具体工作。谢谢您一直鼓励我。

问候

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-24 13:11:02

不幸的是,这不是web服务的工作方式。有状态bean仅对无状态bean是有状态的。而不是为了一个客户。这是非常危险的原因有几个:

-The无状态bean将调用状态保存在其有状态引用中。但是,无状态bean的下一个调用可以在另一个上下文/由另一个客户端进行。

-The有状态bean可以被容器销毁,而无状态者仍然存在/在池中。

您可以在远程调用或web应用程序中使用有状态bean,但不能在webservices上下文中使用。

webservice是每个定义都没有任何应用程序状态的。Java侦听请求,并从实例池中调用一个无状态bean实现。

如果你真的想要实现有状态的web服务,你必须自己去做。以下示例将在Java 6容器中工作:

代码语言:javascript
复制
///  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);
    }
}

您可以将会话存储在单个实例(您自己的池)中。

代码语言:javascript
复制
 @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容器管理):

代码语言:javascript
复制
@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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28661016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档