【问题标题】:Serious, intermittent errors with CF Web ServiceCF Web 服务出现严重的间歇性错误
【发布时间】:2017-03-05 22:40:17
【问题描述】:

对于我们编写和维护的基于 CF Web 服务的 API,我们遇到了非常令人沮丧的情况。多年来,我们有一个稳定的 API,可以与 Ruby、PHP 和 ColdFusion 客户端愉快地工作。然后今年出现了一个 .NET 客户端,我们发现由于我们大量使用结构,我们的 Web 服务无法与静态类型语言互操作。

我们最终意识到我们必须在没有结构的情况下重新编写 API,而且我们已经这样做了。它现在使用缩放器值、数组和 CFC(被转换为 SOAP complexTypes)。 .NET 客户端很高兴,我们用大约 6 种不同的语言编写了概念验证客户端,以确保我们这次可以互操作。

令我们非常沮丧的是,我们的 ColdFusion 7 服务器似乎无法可靠地为新 API 提供服务。重新启动后它可以工作大约一天左右,然后客户端开始收到如下错误:

错误:coldfusion.xml.rpc.CFCInvocationException [java.lang.ClassNotFoundException : tafkan.remote_api.pfapi.v.trunk.rsp_pf_survey_status_array]

java.lang.NoClassDefFoundError: tafkan/remote_api/pfapi/v/trunk/pf_unit

重新启动 CF 实例是解决问题的唯一方法。大量的时间和金钱都花在了重建 API 上,所以每个人都对此束手无策。

我们注意到,我们的 CF 实例的 WEB-INF/cfc-skeletons 目录最终似乎对于 API 使用的每个 CFC 都有两个类的副本。例如:

-rw-r--r--  Feb 17 09:15 remote_api.pfapi.v.trunk.pf_datum.class
-rw-r--r--  Feb  3 12:20 tafkan.remote_api.pfapi.v.trunk.pf_datum.class

错误似乎来自命名空间或类搜索路径问题,因此我们尝试将所有 CFC 引用切换为完全限定(以映射开头的点表示法),而不仅仅是对当前目录中 CFC 的简单引用.这看起来很有希望,但问题在 24 小时内又出现了。

环境:

  • ColdFusion 7,0,2,142559 和 hf702-70523,2 实例集群
  • Sun Java 1.4.2_13
  • Apache 2.0.52
  • Centos 4.5 32 位

也许升级这些古老的软件之一会有所帮助?也许只升级 AXIS?

Adobe 支持似乎不是一种选择,因为 CF7 已停产并处于扩展扩展支持中(仅支持几天)。

更新:

感谢所有参与此讨论的人!以下是有关当前情况的最新信息。

这项服务今天第一次出现问题。一个集群实例仍然能够生成 WSDL,而另一个实例说:

AXIS error
Sorry, something seems to have gone wrong... here are the details:
Exception - java.lang.NoClassDefFoundError: tafkan/remote_api/pfapi/v/trunk/rsp_pf_numeric_array

两个 cfc-skeletons 目录都包含一个名为 tafkan.remote_api.pfapi.v.trunk.rsp_pf_numeric_array.class 的文件,并且似乎不包含我们有时看到的其他名称的文件 (remote_api.pfapi.v.trunk .rsp_pf_numeric_array.class)。自昨天启动服务器以来,cfc-skeletons 中的文件似乎没有被修改过。

两个实例的正常运行时间约为 21.5 小时。我在没有 JIT (-Xint) 的情况下运行。

我现在已经重新启动了这两个实例。它们现在在 Sun Java 1.4.2_19(而不是 _13)上运行,并且 JIT 已重新启用,因为它显然不会导致此错误,并且如果没有它,事情会变得非常慢。我还清除了“保存类文件”复选框。

现在,我们再次等待......

更新 2 问题仍然存在。我不确定此时还可以尝试什么。啊!

仅供参考,这是在http://www.houseoffusion.com/groups/cf-talk/thread.cfm/threadid:60922 交叉发布的

【问题讨论】:

  • 我会先跳到一个更新的 JVM 并考虑破坏集群(如果可以的话,只是循环请求)。另请记住,如果您只能从 1 或 2 个 IP 访问它们,您可以设置一对 CF8 或 CF9 服务器进行免费内部测试
  • 我对 WSDL 命名空间有一点类似的问题。解决方案是使用 .cfm 容器生成适当的 Web 服务信息。也许这也适用于您,请参阅此 QA stackoverflow.com/questions/1119721/…
  • 呃,ColdFusion 只是在后台使用 Apache Axis(Java....上次我检查的完全是强类型的).NET 使用结构应该没有问题。我一直在做。我认为您与一些低于标准的 .net 开发人员打交道,您应该回到结构
  • @kevink,感谢您的评论。我可以尝试升级JVM。我们在开发工作站上的 Apple 的 Java 1.5 和 1.6 上运行此应用程序,因此应该可以进行升级。我不能破坏集群,因为当 JVM 崩溃或我们必须重新启动其中一个服务器时,它是唯一能阻止我们严重停机的事情。
  • @Sergii,感谢您的链接。似乎它可能与我的问题有关,但我不确定如何。我不是用相同的名称生成两个类,而是用两个不同的名称创建一个类!

标签: soap coldfusion axis


【解决方案1】:

我已阅读此主题和 CFTalk 主题。 Mark Kruger 和 Dave Watts 似乎已经提出了我对解决方法的初步想法。我唯一的其他解决方法是使用服务工厂方法捕获错误并刷新 web 服务存根。 (在 CF8-9 中有一个 Admin API 方法可以做到这一点,不确定 CF7)。

研究错误,我将可能的匹配项缩小到以下范围:

http://www.houseoffusion.com/groups/cf-talk/message.cfm/messageid:144821 这是一场比赛,但尚未解决

http://blog.coldfusionpowered.com/?p=28 这是一个非常相似的错误,已通过在所有 CFC 和调用上“修复案例问题”来解决。

ColdFusion Google Adwords Business Component Error 通过重写代码和删除cfcmets来解决(我怀疑这里实际上是其他因素造成的)

http://forums.crystaltech.com/index.php?topic=22364.0 我们现在越来越近了。解决方法涉及错误地拥有两个文档根

http://qaix.com/coldfusion/313-410-web-service-on-cfmx-6-1-jrun-suddenly-not-working-read.shtml 错误消息的完全匹配。将 CFC 映射到文档根目录的完全匹配。解决方案是只有 1 个映射指向 docroot,只有“/”。这可能是解决方案。在 MX 6/6.1 和 7 中,“/”有一个默认映射指向 docroot。如果您有另一个指向 docroot 的映射,那么我可以看到这个问题是如何出现的。检查映射的物理路径并在此处尝试解决方案,仅使用“/”映射。

【讨论】:

  • 感谢 Steven,您的详细研究。我检查并没有定义“/”映射。有一个 /tafkan,我用它在 API 代码中查找我的 CFC。由于您不能在点分隔的对象路径中使用“/”,看来我唯一的选择是使用不合格的本地对象路径(例如“pf_unit”),这不起作用(同样的问题我有现在),或者使用以“tafkan.”开头的“完全合格”路径,我已经在这样做了。我还注意到你提供的最后一个参考,听起来很有希望,是一个每次错误,而不是间歇性错误。还有其他想法吗?
【解决方案2】:

外部客户端如何与您的网络服务交互?只是通过我推测的 WSDL?

是否有可能某些客户端应用程序、单元测试...某物、任何东西...有错误的 URL...有一个指向您的 WSDL 文件的 URL,其中包含“tafkan”?

如果我正在研究它,我可能首先考虑的是找出可能导致该问题的原因。 “tafkan”是您系统中的有效目录吗? .cfc 文件实际存在于文件系统的什么位置,如果在 CF Admin 中有到这些路径的任何映射,以及人们用来访问您的 Web 服务的 URL 是什么?

我相信,这里的关键是进入 CF 的头脑并询问它“你为什么要生成并寻找一个包含“tafkan”作为包的类?

【讨论】:

  • 谢谢,马克。每个人都只是在使用 WSDL 端点。 “tafkan”是一个 CF 映射,它指向我们应用程序的 Web 根目录 (/var/www/tafkan/htdocs)。 CFC 位于 /var/www/tafkan/htdocs/remote_api/pfapi/v/trunk/ 。我不想在这里列出完整的 URL,但它们的形式是 (CLIENT_SITE_URL/remote/pfapi/v/trunk/pfapi.cfc/wsdl)。你关于进入 CF 头脑的建议是一个很好的建议,但我只是不知道如何去做。
  • Marc,我很确定类名是正确的,并且 CF 在一段时间后就无法找到该类。 WSDL 在其架构标记中有 targetNamespace="trunk.v.pfapi.remote_api.tafkan",因此类名 pf_unit.trunk.v.pfapi.remote_api.tafkan 似乎是正确的。
  • 我很茫然。或许可以联系 Steven Erat (talkingtree.com),他曾是 Allaire、MM 和 Adob​​e 的 CF 支持工程师
猜你喜欢
  • 2021-12-01
  • 1970-01-01
  • 2011-01-05
  • 2013-11-18
  • 1970-01-01
  • 2013-09-18
  • 2022-06-16
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多