【问题标题】:Why does cflock sometimes cause 'timeout value is negative' error?为什么 cflock 有时会导致“超时值为负”错误?
【发布时间】:2013-12-03 15:39:38
【问题描述】:

我有一个 ColdFusion 事件网关,它有时会在以下行中产生错误(其中 Local.curThread 是一个数字 1-5):

<cflock name="eventCachedQueryUpdate_thread_#Local.curThread#" timeout="0" throwontimeout="no">

错误是:

消息:超时值为负
类型:java.lang.IllegalArgumentException

这是一个 StackTrace:

java.lang.IllegalArgumentException:超时值为负 java.lang.Object.wait(本机方法)在 Coldfusion.runtime.RWLock.waitForLock(RWLock.java:154) 在 Coldfusion.runtime.RWLock.requestWriteLock(RWLock.java:124) 在 Coldfusion.runtime.RWLock.requestLock(RWLock.java:46) 在 Coldfusion.runtime.LockManager.requestNamedLock(LockManager.java:73) 在coldfusion.tagext.lang.LockTag.doStartTag(LockTag.java:186) 在 cfeventCachedQueryUpdate2ecfc749015300$funcONINCOMINGMESSAGE.runFunction(D:\Applications\CFusion\CustomTags\4C\eventCachedQueryUpdate.cfc:21) 在coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472) 在 Coldfusion.filter.SilentFilter.invoke(SilentFilter.java:47) 在 Coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:368) 在 Coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55) 在coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321) 在 Coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:220) 在 Coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:491) 在 Coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:437) 在 Coldfusion.filter.EventComponentFilter.invoke(EventComponentFilter.java:67) 在 Coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:399) 在 Coldfusion.filter.EventRequestMonitorFilter.invoke(EventRequestMonitorFilter.java:47) 在coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40) 在 Coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28) 在coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38) 在 Coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22) 在 Coldfusion.eventgateway.EventProxy.invokeComponent(EventProxy.java:66) 在 Coldfusion.eventgateway.EventProxy.invokeComponent(EventProxy.java:47) 在 Coldfusion.eventgateway.EventRequestHandler.invokeCFC(EventRequestHandler.java:185) 在 Coldfusion.eventgateway.EventRequestHandler.processRequest(EventRequestHandler.java:111) 在 Coldfusion.eventgateway.EventRequestDispatcher$Task.run(EventRequestDispatcher.java:122) 在coldfusion.util.SimpleWorkerThread.run(SimpleThreadPool.java:210)

由于 cflock 的超时属性始终为 0,我看不出这会如何导致负超时值。任何想法是什么导致了这种情况以及如何防止它?这是 cflock 中的错误吗?

我在带有 Java 1.6.0_17 的 Windows Server 2008 R2 上运行 Adob​​e ColdFusion 9.0.1.274733 Enterprise。

【问题讨论】:

  • 我没有答案,但错误似乎不是指 you 提供的值。而是 CF 服务器根据堆栈跟踪在 RWLock 类的某处生成(使用您的值)的内部编号。如果要相信错误,则该数字为负数,这会在 CF 调用 Object.wait(...) 时导致异常。
  • Leigh,这也是我的想法……这表明存在某种 CF 错误。
  • 我不会过多地讨论这是否是 CF 错误,而会更多地关注如何使您的代码正常工作。即使结论是它是一个错误......这也不会神奇地让你的代码没有错误。
  • 我不会过多考虑这是否是 CF 错误 同意。我提到它是为了在弄清楚如何修复错误时将这种可能性留在你的脑海中。即您可能必须解决错误,而不是修复代码/逻辑错误。这并不能真正帮助解决问题,但可能指向解决问题的正确方法。

标签: java coldfusion coldfusion-9


【解决方案1】:

如果我不得不猜测,那将是事件网关请求处理timeout="0" 的方式不正确。 &lt;cflock&gt; for ColdFusion 9 的文档是这样说的:

如果您设置 timout="0",则超时由 ColdFusion 管理员设置页面中的“Timeout Requests after x”设置确定(如果该设置已启用)。但是,如果未启用该设置,并且您设置了 timeout="0",ColdFusion 可以无限期地等待获取锁。

也许 - 这真的只是猜测 - CF 处理通过事件网关运行时错误超时的锁?

要进行故障排除,可以在锁定代码中添加sleep(),以便并发网关请求超时,然后查看记录了什么?

您是否设置了请求超时?

【讨论】:

  • 是的,CF管理器中的请求超时设置为75秒。
  • 我提到的“为了排除故障,也许放一个 sleep()...”位怎么样?
  • 75 秒对于实时服务器来说是一个 巨大 请求超时。
  • 我将代码更改为使用timeout="75",因此它不依赖于 CF 管理员中设置的值。从那以后,我再也没有收到任何错误。
  • 它是什么样的事件网关,顺便说一句?我想尝试复制它,看看我是否能深入了解它。
猜你喜欢
  • 2022-01-19
  • 2019-11-13
  • 1970-01-01
  • 2012-09-18
  • 2012-06-01
  • 2011-02-08
  • 1970-01-01
  • 2012-05-04
  • 2020-07-16
相关资源
最近更新 更多