首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Axis2重新启动现有Java对象的CF10 10/CF10 11 web服务

使用Axis2重新启动现有Java对象的CF10 10/CF10 11 web服务
EN

Stack Overflow用户
提问于 2014-06-19 18:10:34
回答 2查看 1.5K关注 0票数 2

原始帖子:

这真的很奇怪。

我有一个自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:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<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>

第一呼叫返回

代码语言:javascript
复制
Variables.Answer1 = NO.
Variables.Answer2 = NO.

所有后续调用都会返回

代码语言:javascript
复制
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吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-12 23:56:33

dom_watson (Dom_watson)在上面发布了一个可行的解决方案。我希望我能把正确的答案归功于他,但我想不出该怎么做。(是的,我是StackOverflow新闻。是的,我道歉。)

一开始我不抱希望。毕竟,Axis2 web服务屏蔽的文件也会受到缓存的影响,即使它们是被编译成分离Java文件的。CreateObject()获取对象在内存中的副本似乎是非常可怕的。

没有发生这种事。

/Axis2 web服务/cf10axis2proxy.cfc:

代码语言:javascript
复制
<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也是“公共的”):

代码语言:javascript
复制
<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(见上文):

代码语言:javascript
复制
<cfinvoke webservice     = "http://((snip))/experiments/cf10axis2proxy.cfc?wsdl"
          method         = "IsImpDefined"
          refreshWSDL    = "Yes"
          returnvariable = "Variables.Answer3">
</cfinvoke>

当然,还将Variables.Answer3添加到cfoutput显示中。

第一次执行

代码语言:javascript
复制
Variables.Answer1 = NO.
Variables.Answer2 = NO.
Variables.Answer3 = NO.

后来所有的处决

代码语言:javascript
复制
Variables.Answer1 = NO.
Variables.Answer2 = YES.
Variables.Answer3 = NO.

因此,它被测试和确认(在CF11下,尽管文件名)。dom_watson的建议使Axis2 web服务的cfinvoke行为与https://wikidocs.adobe.com/wiki/display/coldfusionen/cfinvoke所说的cfinvoke的行为方式相同:

  • 瞬时地实例化一个组件或web服务并在其上调用一个方法。

(强调后加)。

谢谢多米尼克。

票数 0
EN

Stack Overflow用户

发布于 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实例?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24313528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档