我正在尝试了解Jax-WS Web服务如何工作,但无法找到有关它们细节的任何资源。举例来说:
我使用Jax-WS注释创建了一个非常简单的Java Web服务,如此
@WebService(name = "MyService", serviceName = "MyService", portName = "MyServicePort")
public class MyService {
private int val;
public MyService() {
val = 0;
}
@WebMethod(action = "setVal")
public void setVal(@WebParam(name = "arg") int arg) {
val = arg;
}
@WebMethod(action = "getVal")
public int getVal() {
return val;
}
}
如果我从中生成一个Web服务(比如使用WS-Gen),请构建一个客户端并从单个客户端进行以下调用:setVal(5)
,getVal()
,将返回什么值对客户?为什么呢?
如果客户端A呼叫setVal(5)
,而客户端B呼叫getVal()
,那么将向客户端返回什么值?为什么?
当然,我可以自己构建一个Web服务并对其进行测试,但我希望能够通过探索来解决问题。 Jax-Ws是否为每个请求创建了带注释类的新实例?它是否以某种方式将相同的源映射到相同的带注释的类实例?它只是将所有请求映射到带注释的类的单例实例吗?是否存在以某种方式选择的有限注释类实例池?
答案 0 :(得分:6)
由于底层HTTP协议,Web服务默认是无状态的。服务器将每个Web服务请求处理为新的交互,即使它来自同一客户端
通常,JAX-WS Web服务是无状态的:也就是说,没有 您在Web服务中设置的局部变量和对象值 对象从一次调用保存到下一次。甚至顺序 来自单个客户的请求被视为独立的, 无状态方法调用。
有一些Web服务用例,客户端可能希望保存数据 在一次调用期间在服务上,然后在一次调用期间使用该数据 后续调用。例如,购物车对象可以是 通过重复调用addToCart web方法然后添加 由getCart Web方法获取。在无状态Web服务中, 购物车对象总是空的,无论多少 调用了addToCart方法。但是通过使用HTTP Sessions进行维护 通过Web服务调用状态,可以构建购物车 递增,然后返回客户端。
在JAX-WS Web服务中启用有状态支持需要极少的支持 客户端和服务器上的编码量。
http://docs.oracle.com/cd/E17904_01/web.1111/e13734/stateful.htm