如何创建实现@WebService的@Singleton bean

时间:2011-08-09 23:27:08

标签: java web-services glassfish singleton

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

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

Screen Shot of NetBeans IDE

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

  

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

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

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

  

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

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

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

这是glassfish 3.1的输出

  

信息:关闭Metro监控根:   AMX:PP = /月/服务器纹[服务器],类型= WSEndpoint,名称= soco.ws.bb.bearBearWS-BearBearImplPort   INFO:EJB StateBean的可移植JNDI名称:   【JAVA:全球/ BearBearService / StateBean soco.ws.bb.StateBean,   java:global / BearBearService / StateBean] INFO:Metro监控根名称   成功设置为:   AMX:PP = /月/服务器纹[服务器],类型= WSEndpoint,名称= soco.ws.bb.bearBearWS-BearBearImplPort   警告:容器org.glassfish.webservices.JAXWSContainer@249ef1e   不支持类com.sun.xml.ws.api.server.Module INFO:Portable   EJB BearBearImpl的JNDI名称:   【JAVA:全球/ BearBearService / BearBearImpl soco.ws.bb.BearBearWS,   java:global / BearBearService / BearBearImpl] INFO:WS00019:EJB端点   部署

这是glassfish 3.0.1的输出

  

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

2 个答案:

答案 0 :(得分:2)

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

3.3.1网络服务组件

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

解决方法可能是在Web Services类中使用@Singleton带注释的成员属性,然后委托给此单例:

@WebService
public class MyService {

    @EJB
    private MySingleton singleton;

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

@Singleton
public class MySingleton {

    // some code ...
}

答案 1 :(得分:2)

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

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

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

请注意,在我将服务重新部署为Singleton而不是无状态时,实例状态会超时,并在超时期限(10分钟)后从50更改为0。

Snapshot of Test UI

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; 
    }
}