404 Handler挂在ColdFusion 10上,在ColdFusion 8上运行完美

时间:2013-03-04 13:15:54

标签: tomcat coldfusion iis-7.5 coldfusion-10 fusionreactor

我的ColdFusion 10服务器上的404处理程序页面出现了奇怪的间歇性问题。这是背景故事:

  1. 我们已经运行了2台负载均衡的ColdFusion 8服务器,没有问题。

  2. 我们已将这两台服务器中的一台升级到ColdFusion 10,以便软启动我们的ColdFusion 10升级。

  3. 我在CF10服务器上安装了Update 8,并删除并重新添加了连接器。

  4. 两台服务器都运行Windows 2008 R2。

  5. 我已经阅读了几篇论坛帖子,说明人们在404页面上遇到连接重置问题,但我没有看到这个问题。我所看到的是FusionReactor中404.cfm文件的挂起线程。以下是从其中一个挂起的线程中获取的堆栈跟踪的示例:

    Thread Stack Trace
    Trace Time:   07:02:14.638 04-Mar-2013
    Request ID:   179934
    Script Name:  http://example.com/404.cfm?404;http://example.com:80/somemissingfile
    Started:      06:07:17.581 04-Mar-2013
    Exec Time:    3297057ms
    Memory Used:  (32%)1,669,600KB
    Memory Free:  3,539,295KB
    Thread ID:    0x53de (21470)
    Thread Name:  ajp-bio-8012-exec-86
    Priority:     5
    Hashcode:     1636847260
    State:        RUNNABLE
    
    "ajp-bio-8012-exec-86" daemon prio=5 runnable
    
    java.net.SocketInputStream.socketRead0(SocketInputStream.java:???)[Native Method]
    java.net.SocketInputStream.read(SocketInputStream.java:129)
    org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:319)
    org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:445)
    org.apache.coyote.ajp.AjpProcessor.receive(AjpProcessor.java:341)
    org.apache.coyote.ajp.AbstractAjpProcessor.finish(AbstractAjpProcessor.java:1032)
    org.apache.coyote.ajp.AbstractAjpProcessor.action(AbstractAjpProcessor.java:386)
    org.apache.coyote.Response.action(Response.java:170)
    org.apache.coyote.Response.finish(Response.java:276)
    org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:288)
    org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:108)
    com.intergral.fusionreactor.plugin.amf.InterposerOutputStream.close(InterposerOutputStream.java:104)
    com.intergral.fusionreactor.trackedstream.TrackedStream.close(TrackedStream.java:113)
    com.intergral.fusionreactor.filter.softkill.SoftKillResponseStream.close(SoftKillResponseStream.java:146)
    com.intergral.fusionreactor.filter.FusionReactorResponseWrapper.finish(FusionReactorResponseWrapper.java:192)
    com.intergral.fusionreactor.core.FusionReactor.finish(FusionReactor.java:683)
    com.intergral.fusionreactor.filter.FusionReactorCoreFilter.doHttpServletRequest(FusionReactorCoreFilter.java:575)
    com.intergral.fusionreactor.filter.FusionReactorCoreFilter.doFusionRequest(FusionReactorCoreFilter.java:337)
    com.intergral.fusionreactor.filter.FusionReactorCoreFilter.doFilter(FusionReactorCoreFilter.java:246)
    com.intergral.fusionreactor.filter.FusionReactorFilter.doFilter(FusionReactorFilter.java:121)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:414)
    org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:204)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    java.lang.Thread.run(Thread.java:662)
    

    我试过通过FusionReactor手动杀死这些线程,但它们不会死。清除挂起线程的唯一方法是重新启动ColdFusion服务(自从我升级到ColdFusion 10以来,我每天至少要做一次。

    除了运行我们的标准布局自定义标记并显示未找到页面的通知之外,404没有做任何特殊操作。

    看一下线程转储,看来ColdFusion已经完成了处理并用输出完成了缓冲区的填充,但它还没有完成发送到浏览器?

    org.apache.coyote.ajp.AbstractAjpProcessor.finish(AbstractAjpProcessor.java:1032)
    org.apache.coyote.ajp.AbstractAjpProcessor.action(AbstractAjpProcessor.java:386)
    org.apache.coyote.Response.action(Response.java:170)
    org.apache.coyote.Response.finish(Response.java:276)
    org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:288)
    org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:108)
    

    关于结束和完成的内容很多,但是后面的步骤有更多的读取和响应。所以我不确定这里会发生什么,但它肯定会阻碍我们的ColdFusion 10迁移的完成。我需要确切地发现导致这些挂起线程的原因。

1 个答案:

答案 0 :(得分:1)

您遇到的问题与我在1月份遇到的错误相同。我已经在Adobe的bugbase中记录了这个错误:

https://bugbase.adobe.com/index.cfm?event=bug&id=3494728

他们的工程团队已经承认了这个问题,但在实际修复方面没有ETA。 Adobe的CF10连接器对我们来说非常麻烦。您可以设置超时以杀死我的解决方法中列出的这些挂起线程,这至少可以使您不必每天重新启动服务器。祝你好运!