Coldfusion 使用Axis2重新启动现有Java对象的web服务

Coldfusion 使用Axis2重新启动现有Java对象的web服务,coldfusion,axis2,Coldfusion,Axis2,原创帖子: 这真的很奇怪 我有一个自CFMX(即自CF6)以来就一直工作的web服务。我们最近升级到了CF10。(不是我的选择,我游说CF11。)我们有需要旧WSDL的用户,因为他们基于旧格式的WSDL为他们的WS-client生成存根。因此,我在cfcomponent标记中添加了wsversion=“1”。我们得到了老式的WSDL,但是webservices.log说“使用Axis2…”。这是出乎意料的,但不是我所说的真正奇怪的。继续读下去 web服务是无状态的。我听说现在CF web服务可以

原创帖子:

这真的很奇怪

我有一个自CFMX(即自CF6)以来就一直工作的web服务。我们最近升级到了CF10。(不是我的选择,我游说CF11。)我们有需要旧WSDL的用户,因为他们基于旧格式的WSDL为他们的WS-client生成存根。因此,我在cfcomponent标记中添加了wsversion=“1”。我们得到了老式的WSDL,但是webservices.log说“使用Axis2…”。这是出乎意料的,但不是我所说的真正奇怪的。继续读下去

web服务是无状态的。我听说现在CF web服务可以进行会话控制,但我们没有这样做。无Application.cfc,无cfapplication标签。所以每个cfinvoke都是它自己的、完全自包含的执行,对吗?至少我是这么想的我在之前的web服务调用中定义的web服务的后续调用中看到了一些东西。就好像相同的内存正在被重用一样

例如,我使用变量(已定义)的存在性来检测条件。它发生在调用1中。没问题,我修好了。但是这个变量仍然存在于调用2中

我无条件地定义了一个UDF,因为在调用的早期不会定义它。在下一次调用中,它会抱怨我两次试图定义该UDF!相同的文件!该UDF名称仅在该文件中定义一次

我有条件地定义了一个数组,并在一次调用中向其中添加了跟踪消息,我发现同一个数组仍然存在,并且在后续调用中仍然包含这些跟踪消息!(很难说相同的时间戳会再次出现。)

所有这些症状一直持续到我们重新启动CF服务器。不太好。一点也不好

这就好像我们正在重新启动CFM文件类的旧的、脏的实例化,而不是使用新的ClassName()来获得我们自己的、对后续调用唯一的新副本

启用可信缓存是否。保存类文件是否。您可能认为仅这两个文件就需要将.cfm重新编译为.java,然后将.java重新编译为.class,然后将.class重新编译为内存(在每次请求时从头开始),不是吗

这以前从未发生过,但在CF10下一直发生。我的系统管理员是否遗漏了CF10发布文档中的某些内容

更新(美国东部时间当天下午5:40):

正如您在下面的评论和我的回答中所看到的,这个问题被证明只是轴2。我原以为在CFC中的wsversion=“1”被删掉了,可能是其他一些善意的灵魂试图解决同样的问题

因为这个CF10行为太可怕了,我以惊人的速度获得了部署2个实验性web服务的许可。我现在有了证据,一个简单的例子,证明Axis 2有问题(至少在我们的站点上,我们的配置有问题):

/实验/cf10axis1.cfc:

<cfcomponent displayname="Axis 1 Service" wsversion="1">
<cffunction name="IsFooDefined" access="remote" returntype="string" output="No">
    <cfset Variables.Foo = IsDefined("Variables.Foo")>
    <cfreturn Variables.Foo>
</cffunction>
</cfcomponent>
所有后续呼叫返回

Variables.Answer1 = NO.
Variables.Answer2 = YES.
没有比这更确切的证据了

该死的,我喜欢StackOverflow如何清晰地呈现CFML。真的很甜

确认:

这最初发生在Sun Sparc Solaris上的CF10中。我刚刚在MacBook Pro上进行了CF11中相同的极简测试(如上),得到了完全相同的结果。我把这篇文章标题上的问号去掉了,我把它改成了CF10/CF11。这不再是问题了

我不认为这是一个错误的错误。是Axis2在做这件事

这对人们如何编码有着严重的影响,但我在网络上找不到任何提及。仅仅因为你没有在调用中做一些事情,并不意味着在内存中就不是这样。中止标志保持设置。不能使用cfparams;您必须使用cfset。每个UDF都必须从属于cfif not IsDefined()。令人难以置信

我怎么会是第一个发现这一点的人?CF11出局了。没有人在CF中使用Axis2吗


如果我不是一个天生快乐的人,我现在会非常沮丧。:-)

这不是轴2中的问题

这是Axis 2 web服务支持设计方式的行为变化

在Axis1中,对于每个web服务请求,都会创建一个新的CFC实例,并由该新实例处理该请求。这就是为什么每次请求都会重新初始化变量

在Axis 2中,CFC实例仅在您第一次访问服务时创建(第一次访问WSDL,或第一次调用web服务)。对于每个后续请求,都使用相同的实例。因此,您可以在那里看到缓存。只有在修改服务CFC时,才会创建新的CFC实例

通常,如果您在tomcat中部署基于axis2的aar(使用Java),您将看到相同的行为。i、 例如,如果您的类具有state,并且该状态在web服务函数中被修改,那么您将在下一个请求中获得修改后的值

这是我们为提高性能而做出的设计决策(不是每次初始化实例并将其注册到Axis 2 framework,而是重新使用实例)。您是否需要为每个web服务请求使用不同的CFC实例

dom_watson(Dominic watson)发布了一个可行的解决方案,如上图所示。我希望我能相信他的回答是正确的,但我不知道该怎么做。(是的,我是个新手。是的,我道歉。)

起初我不抱希望。毕竟,Axis2 web服务包含的文件也受到缓存的影响,即使它们被编译为单独的Java类文件。CreateObject()将获取该对象的内存副本,这似乎是完全可怕的

那没有发生

/实验/cf10axis2proxy.cfc(Axis2 web服务):

随后的所有处决都产生了

Variables.Answer1 = NO.
Variables.Answer2 = YES.
Variables.Answer3 = NO.
因此,它经过了测试和确认(根据CF11,尽管文件名不同)。多姆·沃森的苏
Variables.Answer1 = NO.
Variables.Answer2 = NO.
Variables.Answer1 = NO.
Variables.Answer2 = YES.
<cfcomponent displayname="Axis2Proxy" wsversion="2">
<cffunction name="IsImpDefined" access="remote" returntype="string" output="No">
    <cfset Variables.ImplObject = CreateObject("component", "experiments.cf10axis2impl")>
    <cfreturn Variables.ImplObject.IsImpDefined()>
</cffunction>
</cfcomponent>
<cfcomponent displayname="Axis2Implementation">
<cffunction name="IsImpDefined" access="public" returntype="string" output="No">
    <cfset Variables.Imp = IsDefined("Variables.Imp")>
    <cfreturn Variables.Imp>
</cffunction>
</cfcomponent>
<cfinvoke webservice     = "http://((snip))/experiments/cf10axis2proxy.cfc?wsdl"
          method         = "IsImpDefined"
          refreshWSDL    = "Yes"
          returnvariable = "Variables.Answer3">
</cfinvoke>
Variables.Answer1 = NO.
Variables.Answer2 = NO.
Variables.Answer3 = NO.
Variables.Answer1 = NO.
Variables.Answer2 = YES.
Variables.Answer3 = NO.