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 + ".";
}
}