原始帖子:
这真的很奇怪。
我有一个自CFMX (即,自CF6)以来一直在工作的web服务。我们最近升级为CF10。(这不是我的选择,我为CF11游说。)我们有需要旧WSDL的用户,因为他们基于旧格式的WSDL为WS客户端生成存根。因此,我将wsversion="1“添加到cfcomponent标记中。我们得到了老式的WSDL,但是webservices.log说“使用Axis 2.”。这是出乎意料的,但我指的并不是真正奇怪的东西。继续往下读。
web服务是无状态的。我听说现在使用CF web服务可以进行会话控制,但我们不会这样做。没有Application.cfc,没有cfapplication标记。所以每个cfinvoke都是自己的,完全独立的执行,对吗?或者我是这样想的。--我在web服务的后续调用中看到了一些东西,这些调用是在、、以前对web服务的调用中定义的。就好像相同的内存正在被重用一样。
例如,我使用变量的存在(带有IsDefined)来检测条件。它发生在调用1中。没问题,我修复了它。但是,变量仍然存在于调用2中!
我无条件地定义了一个UDF,因为它不会在调用的早期定义。在下一次调用时,它会抱怨我试图两次定义该UDF!同样的文件!该UDF名称仅在该文件中定义一次!
我在一次调用中有条件地将数组和ArrayAppend跟踪消息定义到它中,我看到相同的数组仍然存在,并且在随后的调用中仍然包含这些相同的跟踪消息!(很难用同样的时间戳重新出现。)
所有这些症状一直持续到我们重新启动CF为止。不太好。不太好的在。
这就好像我们要重新启动CFM文件类的旧的、脏的实例化,而不是执行一个新的ClassName()来获得我们自己的新副本,这对于后续调用来说是唯一的。
启用可信缓存为No。保存类文件为No。您可能认为仅这两个就需要将.cfm重新编译为.java,然后将.java重新编译为.class,然后再将.class编译为内存(从零开始处理每个请求),不是吗?
这种情况以前从未发生过,但在CF10下却是一贯发生的。我的sysadmin是否遗漏了CF10发布文档中的某些内容?
更新(同一天,东部时间下午5:40 ):
正如您在评论和我的答复中所看到的,下面这个问题证明仅是Axis 2。我认为是在CFC中的wsversion="1“被删掉了,可能是因为其他一些善意的灵魂试图解决同样的问题。
因为这种CF10行为太可怕了,我得到了部署两个实验性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>/实验/cf10axis2.cfc:
<cfcomponent displayname="Axis 2 Service" wsversion="2">
<cffunction name="IsBarDefined" access="remote" returntype="string" output="No">
<cfset Variables.Bar = IsDefined("Variables.Bar")>
<cfreturn Variables.Bar>
</cffunction>
</cfcomponent>/试验/调用_call_CF10_webservices.cfm:
<cfinvoke webservice = "http://((snip))/experiments/cf10axis1.cfc?wsdl"
method = "IsFooDefined"
refreshWSDL = "No"
returnvariable = "Variables.Answer1">
</cfinvoke>
<cfinvoke webservice = "http://((snip))/experiments/cf10axis2.cfc?wsdl"
method = "IsBarDefined"
refreshWSDL = "No"
returnvariable = "Variables.Answer2">
</cfinvoke>
<cfoutput>
Variables.Answer1 = #Variables.Answer1#.<br/>
Variables.Answer2 = #Variables.Answer2#.<br/>
</cfoutput>第一呼叫返回
Variables.Answer1 = NO.
Variables.Answer2 = NO.所有后续调用都会返回
Variables.Answer1 = NO.
Variables.Answer2 = YES.没有比这更确凿的证据了。
该死的,我喜欢StackOverflow多么干净地渲染CFML。真的很甜。
确认:
这最初发生在Solaris上的CF10中。我刚才在一个CF11 Pro上运行了相同的极简测试(上面),得到了完全相同的结果。我从这篇文章的标题中去掉了问号,我把它写成of 10/of 11。这不再是问题了。
我不认为这是个CF虫。是Axis2在做这个。
这对人们的编码方式有着严重的影响,但我在网上找不到任何提及它的地方。仅仅因为在调用中没有做一些事情,并不意味着内存中的情况就不是这样。仍然设置中止标志。您不能使用cfparams,您必须使用cfset。每个UDF必须从属于cfif而不是IsDefined()。精神错乱。
我怎么会是第一个发现这个的人?CF11出局了。在CF中没有人使用Axis2吗?
如果我不是一个天生快乐的人,我现在就会很沮丧。:-)
发布于 2014-12-12 23:56:33
dom_watson (Dom_watson)在上面发布了一个可行的解决方案。我希望我能把正确的答案归功于他,但我想不出该怎么做。(是的,我是StackOverflow新闻。是的,我道歉。)
一开始我不抱希望。毕竟,Axis2 web服务屏蔽的文件也会受到缓存的影响,即使它们是被编译成分离Java文件的。CreateObject()获取对象在内存中的副本似乎是非常可怕的。
没有发生这种事。
/Axis2 web服务/cf10axis2proxy.cfc:
<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>/note/cf10axis2in.cfc(注意,即使不是web服务,access也是“公共的”):
<cfcomponent displayname="Axis2Implementation">
<cffunction name="IsImpDefined" access="public" returntype="string" output="No">
<cfset Variables.Imp = IsDefined("Variables.Imp")>
<cfreturn Variables.Imp>
</cffunction>
</cfcomponent>添加到/ to /call_CO2_CF10_webservices.cfm(见上文):
<cfinvoke webservice = "http://((snip))/experiments/cf10axis2proxy.cfc?wsdl"
method = "IsImpDefined"
refreshWSDL = "Yes"
returnvariable = "Variables.Answer3">
</cfinvoke>当然,还将Variables.Answer3添加到cfoutput显示中。
第一次执行
Variables.Answer1 = NO.
Variables.Answer2 = NO.
Variables.Answer3 = NO.后来所有的处决
Variables.Answer1 = NO.
Variables.Answer2 = YES.
Variables.Answer3 = NO.因此,它被测试和确认(在CF11下,尽管文件名)。dom_watson的建议使Axis2 web服务的cfinvoke行为与https://wikidocs.adobe.com/wiki/display/coldfusionen/cfinvoke所说的cfinvoke的行为方式相同:
(强调后加)。
谢谢多米尼克。
发布于 2014-08-21 13:42:13
这在Axis 2中不是一个问题。
这是Axis 2 web服务支持设计方式上的一种行为改变。
在Axis 1中,为每个web服务请求创建一个新的CFC实例,该请求由这个新实例处理。这就是为什么变量总是为每个请求重新初始化的原因。
在Axis 2中,只在您第一次访问服务(第一次访问WSDL或第一次调用web服务)时才创建CFC实例。对于每个后续请求,都使用相同的实例。所以你在那里看到了缓存。只有在修改服务CFC时才会创建新的CFC实例。
通常,如果您在tomcat中部署基于axis2的aar (使用Java),您将看到相同的行为。也就是说,如果您的类具有状态,并且在web服务函数中对该状态进行了修改,那么您将在下一个请求中获得修改后的值。
这是我们为提高性能而做出的设计决策(不是每次初始化实例并向Axis 2框架注册,而是重新使用实例)。您是否要求对每个web服务请求使用不同的CFC实例?
https://stackoverflow.com/questions/24313528
复制相似问题