Web services 我可以在glassfish V3上使用单例生命周期Web服务吗?

Web services 我可以在glassfish V3上使用单例生命周期Web服务吗?,web-services,singleton,glassfish,lifecycle,Web Services,Singleton,Glassfish,Lifecycle,我用Netbeans 6.5创建了一个简单的Web服务,并部署到2台glassfish服务器V2.1和V3。ws有一个基本方法GetInstanceID,我从客户端调用了3次 @WebService() public class FirstWS { private long m_instanceID = 0; //instance id //Log private void WriteLog(String cadena){ String msg = ""; DateFor

我用Netbeans 6.5创建了一个简单的Web服务,并部署到2台glassfish服务器V2.1和V3。ws有一个基本方法GetInstanceID,我从客户端调用了3次

@WebService()
public class FirstWS {

private long m_instanceID = 0;   //instance id

//Log
private void WriteLog(String cadena){
    String msg = "";
    DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss:SSS");
    Date fecha = new Date();
    msg = dateFormat.format(fecha) + " ***** " + this.getClass().getName() + " (m_instanceID=" + m_instanceID + "): " + cadena +
          "           " + "ThreadID=" + Thread.currentThread().getId() + " ThreadName=" + Thread.currentThread().getName();
    Logger.getLogger(this.getClass().getName()).log(Level.INFO,msg);
}

//Constructor
public FirstWS() {
    Random rnd = new Random();
    m_instanceID = rnd.nextLong();
    WriteLog("Executing Constructor");
}

//PostConstruct
@PostConstruct
public void ThisIsThePostConstruct() {
    WriteLog("Executing PostConstruct");
}

//PreDestroy
@PreDestroy
public void ThisIsThePreDestroy() {
    WriteLog("Executing PreDestroy");
}

//Method
@WebMethod(operationName = "GetInstanceID")
@WebResult(name="InstanceID")
public long GetInstanceID() {
    //TODO write your implementation code here:
    WriteLog("Executing GetInstanceID");
    return m_instanceID;
}

}
我一直认为web服务在默认情况下是单例的

glassfish V2.1服务器上,ws按照预期工作,具有单例生命周期:

  • 只创建一个实例
  • 构造函数方法只执行一次
  • 如果使用postconstructor方法,则仅执行一次
  • 取消部署ws时,只执行一次predestroy方法
客户端日志

InstanceID=-4747957096764272596

InstanceID=-4747957096764272596

InstanceID=-4747957096764272596

服务器日志

2010年8月26日13:08:15:146******first.test.FirstWS(m_instanceID=-4747957096764272596):正在执行构造函数ThreadID=68 ThreadName=httpSSLWorkerThread-8080-0

2010年8月26日13:08:15:161****first.test.FirstWS(m_instanceID=-4747957096764272596):正在执行PostConstruct ThreadID=68 ThreadName=httpSSLWorkerThread-8080-0

2010年8月26日13:08:15:364****first.test.FirstWS(m_instanceID=-4747957096764272596):执行GetInstanceID ThreadID=69 ThreadName=httpSSLWorkerThread-8080-1

2010年8月26日13:08:15:380******first.test.FirstWS(m_instanceID=-4747957096764272596):执行GetInstanceID ThreadID=69 ThreadName=httpSSLWorkerThread-8080-1

2010年8月26日13:08:15:396****first.test.FirstWS(m_instanceID=-4747957096764272596):执行GetInstanceID ThreadID=69 ThreadName=httpSSLWorkerThread-8080-1

2010年8月26日13:08:38:849******first.test.FirstWS(m_instanceID=-4747957096764272596):正在执行PreDestroy ThreadID=626 ThreadName=Thread-540

但是在glassfish V3服务器上,ws没有按预期工作,因为每次调用GetInstanceID都会创建一个新的ws实例:

  • 为每个调用创建一个实例
  • 每次调用执行一次构造函数方法
  • 对每个调用执行两次(!?!?)后构造函数方法
  • 取消部署ws时不调用predestroy方法
客户端日志

InstanceId=7754248300017958713

InstanceId=-171418448589890589231

InstanceId=-4156829683887899017

服务器日志

信息:26/08/2010 15:16:11:429****first.test.FirstWS(m_instanceID=7754248300017958713):正在执行构造函数ThreadID=103 ThreadName=http-thread-pool-8080-(2)

信息:26/08/2010 15:16:11:429****first.test.FirstWS(m_instanceID=7754248300017958713):正在执行PostConstruct ThreadID=103 ThreadName=http-thread-pool-8080-(2)

信息:26/08/2010 15:16:11:429****first.test.FirstWS(m_instanceID=7754248300017958713):正在执行PostConstruct ThreadID=103 ThreadName=http-thread-pool-8080-(2)

信息:26/08/2010 15:16:12:429******first.test.FirstWS(m_instanceID=7754248300017958713):执行GetInstanceID ThreadID=103 ThreadName=http-thread-pool-8080-(2)

信息:26/08/2010 15:16:12:460******first.test.FirstWS(m_instanceID=-171418485890589231):正在执行构造函数ThreadID=102 ThreadName=http-thread-pool-8080-(1)

信息:26/08/2010 15:16:13:429****first.test.FirstWS(m_instanceID=-171418485890589231):正在执行PostConstruct ThreadID=102 ThreadName=http-thread-pool-8080-(1)

信息:26/08/2010 15:16:13:429****first.test.FirstWS(m_instanceID=-171418485890589231):正在执行PostConstruct ThreadID=102 ThreadName=http-thread-pool-8080-(1)

信息:26/08/2010 15:16:14:429******first.test.FirstWS(m_instanceID=-171418485890589231):执行GetInstanceID ThreadID=102 ThreadName=http-thread-pool-8080-(1)

信息:26/08/2010 15:16:14:445******first.test.FirstWS(m_instanceID=-4156829683887899017):正在执行构造函数ThreadID=103 ThreadName=http-thread-pool-8080-(2)

信息:26/08/2010 15:16:15:429****first.test.FirstWS(m_instanceID=-4156829683887899017):正在执行PostConstruct ThreadID=103 ThreadName=http-thread-pool-8080-(2)

信息:26/08/2010 15:16:15:429****first.test.FirstWS(m_instanceID=-4156829683887899017):正在执行PostConstruct ThreadID=103 ThreadName=http-thread-pool-8080-(2)

信息:26/08/2010 15:16:15:429****first.test.FirstWS(m_instanceID=-4156829683887899017):执行GetInstanceID ThreadID=103 ThreadName=http-thread-pool-8080-(2)

信息:正在关闭Metro监视根目录:amx:pp=/mon/server mon[server],type=WSEndpoint,name=/FirstWebApplication-FirstWSService-FirstWSPort


那么,为什么玻璃鱼V3会出现这种行为?如何在glassfish V3上提供单例web服务?

我认为这可能是一个规范问题(Java EE 5与Java EE 6),您可能需要使用:


更正:这在Glassfish V3中适用。

我认为这可能是一个规范问题(Java EE 5与Java EE 6),您可能需要使用:


更正:这在Glassfish V3中适用。

最后我发现了问题:项目的类型。在NetBeans中,我在一个“web应用程序”项目中创建了web服务,因此它被部署到Glassfish中的servlet容器中,@Stateless和@Singleton注释不起作用。您必须在“EJB Moule”项目中创建ws,并将其部署到EJB容器中,以便@Stateless和@Singleton注释能够正确工作


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

最后我发现了问题:项目的类型。在NetBeans中,我在“web应用程序”项目中创建了web服务,因此它被部署到Glassfish和@stateless和@Sing中的servlet容器中
package com.sun.tutorial.javaee.ejb;

import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;

    @Stateless
    @WebService
    public class HelloServiceBean {
        private String message = "Hello, ";

        public void HelloServiceBean() {}

        @WebMethod
        public String sayHello(String name) {
            return message + name + ".";
        }
    }