【问题标题】:How to create a @Singleton bean that implements a @WebService如何创建实现@WebService 的@Singleton bean
【发布时间】:2011-08-09 23:27:08
【问题描述】:

已编辑:在相信这是 NetBeans 7.0 编辑器错误之后。它仍然可以编译并且可以部署。

我想将 @WebService;@Stateless 实现的 Web 服务转换为 @Singleton bean,但是当我用 @Singleton 注释替换 @WebService 时...我在 IDE 编辑器中得到下面的图像

当然,当我做一些愚蠢的事情,比如同时拥有 @WebService 和 @Stateless 并部署在 glassfish 中时,我会得到:

严重错误:注释处理失败...

下面是一个链接(还有更多,但我现在仅限于两个链接),它让我相信单例 bean 可以按照我尝试使用它们的方式使用。

http://download.oracle.com/javaee/6/tutorial/doc/gipjg.html

“单例会话 bean 提供与无状态会话 bean 类似的功能,但不同之处在于每个应用程序只有一个单例会话 bean,而不是无状态会话 bean 池,其中任何一个都可以响应客户端请求。与无状态会话 bean 一样,单例会话 bean 可以实现 Web 服务端点。”

此链接可能暗示编译器中存在已在 jboss 环境中修复的错误。我不确定这个问题是否相关,并且很想听听有经验的用户的想法。 ;)

https://issues.jboss.org/browse/EJBTHREE-2161

这是 glassfish 3.1 的输出

INFO:关闭 Metro 监控根目录: amx:pp=/mon/server-mon[server],type=WSEndpoint,name=soco.ws.bb.bearBearWS-BearBearImplPort 信息:EJB StateBean 的可移植 JNDI 名称: [java:global/BearBearService/StateBean!soco.ws.bb.StateBean, java:global/BearBearService/StateBean] INFO: Metro 监控 rootname 成功设置为: amx:pp=/mon/server-mon[server],type=WSEndpoint,name=soco.ws.bb.bearBearWS-BearBearImplPort 警告:容器 org.glassfish.webservices.JAXWSContainer@249ef1e 不支持类 com.sun.xml.ws.api.server.Module INFO: Portable EJB BearBearImpl 的 JNDI 名称: [java:global/BearBearService/BearBearImpl!soco.ws.bb.BearBearWS, java:global/BearBearService/BearBearImpl] 信息:WS00019:EJB 端点 部署

这是 glassfish 3.0.1 的输出

INFO:Metro 监控 rooname 成功设置为: amx:pp=/mon/server-mon[服务器],类型=WSEndpoint, 名称=AppleImplService-AppleImplPort 警告:容器 org.glassfish.webservices.JAXWSContainer@191f81e 不支持类 com.sun.xml.ws.api.server.Module INFO:EJB 的可移植 JNDI 名称 苹果实施" [java:global/AppleService/AppleImpl!com.ws.srv.MyService,java:global/AppleService/AppleImpl] 信息:WS00019:EJB 端点部署 AppleService 监听 地址http://localhost:8080/AppleImplService/AppleImpl INFO: AppleService 在 438 毫秒内成功部署

【问题讨论】:

  • Glassfish 的版本以及部署时 server.log 显示的内容。
  • 奇怪的是,我在当前系统上找不到应该使用 GF3.1 的 server.log 文件。 domain1/log 文件夹是空的。我在描述中更新了服务器的输出窗口。
  • 如果你能找到日志,我打赌你会在里面找到线索。
  • 我不确定您的警告是否相关。当您更改注释时它会消失吗?查看java.net/jira/browse/GLASSFISH-9949
  • 更新了日志内容的帖子,它只是反映了 ide 输出控制台的输出。奇怪的是,我不再看到“严重错误:注释处理失败”。我想知道这种组合是否可以接受,但 IDE 会在编辑器中将其标记为编译错误。我做了一个干净的构建,它似乎构建了两个错误。

标签: java web-services glassfish singleton


【解决方案1】:

正如@bkail 指出的那样,JSR 109 明确允许 @WebService@Singleton 的组合。 Chapter 3.3.1 状态:

3.3.1 Web 服务组件

本规范定义了两种实现 Web 服务的方法,它们在 Java EE 环境中运行,但不将 Web 服务实现限制为仅这些方法。第一个是 JAX-RPC 或 JAX-WS 编程模型的基于容器的扩展,它将 Web 服务定义为在 Web 容器中运行的 Java 类。第二种在 EJB 容器中使用无状态会话 EJB 或单例会话 EJB(仅适用于 JAX-WS 服务)的受限实现。其他服务实现也是可能的,但本规范未定义。

一种解决方法可能是在您的 Web 服务类中有一个 @Singleton 注释的成员属性,然后委托给这个单例:

@WebService
public class MyService {

    @EJB
    private MySingleton singleton;

    public void doSomeService() {
        this.singleton.doSomeService();
    }
}

@Singleton
public class MySingleton {

    // some code ...
}

【讨论】:

  • JSR 109 维护版本 1.3 明确允许 Singleton+WebService 注解。你能给出一个更具体的原因,为什么 Web 服务引擎不应该支持这个(即,为什么这不仅仅是一个错误)?
  • 我一直在使用它作为解决方法。但我仍然希望这些注释最终可以一起使用,因为我喜欢用一个类解决所有问题的想法。 ;)
  • @bkail:我不知道它在 MR 中明确指定。将更新答案...
  • @home 还有时间修改答案吗?
  • @simgineer:是的,这似乎是一个错误。
【解决方案2】:

这是 NetBeans 7.0 编辑器中的一个错误。我能够使用@WebService、@Singleton 构建和部署 WS,即使服务名称带有红色下划线表示编译错误。刚刚运行了一个测试来验证规范 bean 是否像宣传的那样工作。我将在下面提供代码和我的测试 ui 的快照。

感谢@home、@bkali 和@Preston 的贡献。

作为 bug 提交给 netbeans:http://netbeans.org/bugzilla/show_bug.cgi?id=200911

当我将服务重新部署为单例而不是无状态时,实例状态会超时并在超时时间段(10 分钟)后从 50 变为 0。

Web 服务测试代码:

import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.jws.WebService;
import javax.jws.WebParam;
import javax.ejb.Stateless;

@WebService(serviceName = "soco.ws.bb.bearBearWS")
@Singleton
//@Stateless
public class BearBearImpl implements BearBearWS {

    int state = 0;
    static int staticState = 0;
    @EJB StateBean sb = new StateBean();

    @Override
    public String hello(@WebParam(name = "name") String txt) {
        return "Hello " + txt + " !";
    }

    @Override
    public void setAllState(int in) {
        System.out.println("setting instance state from "+state+" to "+in);
        state = in; 
        System.out.println("setting static state from "+staticState+" to "+in);
        staticState = in; 
        System.out.println("setting singleton state from "+sb.state+" to "+in);
        sb.state = in;
    }

    @Override
    public int getInstanceState() { 
        System.out.println("returning instance state "+state);
        return state; 
    }

    @Override
    public int getStaticState() { 
        System.out.println("returning static state "+staticState);
        return staticState; 
    }

    @Override
    public int getSingletonState() { 
        System.out.println("returning singleton state "+sb.state);
        return sb.state; 
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多