Flex3/Tomcat/BlazeDS/Spring中偶尔出现NetConnection.Call.Failed问题

4
我有一个非常大的问题。我使用Flex3/Tomcat/BlazeDS/Spring编写了一个大型应用程序,在本地开发时运行良好,在常见的开发环境中部署也很好,但是当部署到我们的测试环境时经常失败。
故障似乎在远程请求花费了很长时间(超过20秒)时发生最多。在我的开发服务器上,错误发生的频率较低,只有在请求时间非常长(超过45秒)时才会出现。然而,错误有时也会在瞬间发生(发送请求后立即失败)。大多数错误也具有HTTP状态:502(错误网关),但有些只说HTTP失败。
除将war文件放在webapps目录中外,我没有对BlazeDS进行任何特殊处理。该应用程序通过https访问。远程调用仅通过“destination”引用服务器。我们DEV和TEST实例上的tomcat服务器具有相同的java参数(相同的Xms和Xmx等)。以下是我相关的文件:
services-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<services-config>
    <services>
        <default-channels>
           <channel ref="my-secure-amf"/>
        </default-channels>
    </services>
    <channels>
        <channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
            <endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/>
            <properties>
                <add-no-cache-headers>false</add-no-cache-headers>
            </properties>
        </channel-definition>
    </channels>
<services-config>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    ...

    <servlet>
        <servlet-name>spring-flex</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/flexContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>spring-flex</servlet-name>
        <url-pattern>/messagebroker/*</url-pattern>
    </servlet-mapping>
</web-app>

flexContext.xml

<!--
    I have component-scan tags here to scan my class files. The Controller I'm using for flex has an annotation on it to define it as a remote destination. Here it is:
    @Controller
    @RemotingDestination(value = "dest", channels="my-secure-amf")
    public class FlexController {
-->

<bean id="flexExceptionTranslator" class="edu.liberty.zconduct.web.FlexExceptionTranslator" />

<flex:message-broker>
    <flex:exception-translator ref="flexExceptionTranslator"/>
    <!-- <flex:secured /> Had this previously, but it wasn't working then, either -->
</flex:message-broker>

我已经走投无路了。这个错误会导致应用崩溃。如果你能帮忙,请一定要帮帮我。

编辑 我切换到 http,但仍然收到错误。现在 Tomcat 显示:

警告:发送结束数据包时出错

java.net.SocketException: Broken pipe

我查看了 jk_mod 的 apache 日志,发现一些调试信息,看起来像我发送的请求,然后是以下内容:

[debug] ajp_send_request::jk_ajp_common.c (1592): 重新发送请求体 (432)

[debug] jk_shutdown_socket::jk_connect.c (681): 准备关闭套接字 68

[debug] jk_shutdown_socket::jk_connect.c (732): 关闭套接字 68 并读取 0 残留字节

[info] ajp_connection_tcp_get_message::jk_ajp_common.c (1150): (myTestServer) 无法从 Tomcat 接收响应头消息,可能存在网络问题或 tomcat (xx.xx.xx.xx:xxxx) 已关闭 (errno=11)

[error] ajp_get_reply::jk_ajp_common.c (1962): (myTestServer) Tomcat 已关闭或拒绝连接。 未向客户端发送任何响应(尚未)

[info] ajp_service::jk_ajp_common.c (2447): (myTestServer) 发送请求至 Tomcat 失败 (可恢复),(attempt=2)

[error] ajp_service::jk_ajp_common.c (2466): (myTestServer) 连接到 Tomcat 失败。

[debug] ajp_reset_endpoint::jk_ajp_common.c (743): (myTestServer) 使用 sd = 4294967295 (套接字关闭) 重置端点

[debug] ajp_done::jk_ajp_common.c (2905): 为工作进程 myTestServer 回收连接池插槽=0

[info] jk_handler::mod_jk.c (2615): 对于 worker=myTestServer,服务错误=0


我在日志文件中没有看到任何消息。 如果有帮助的话,BlazeDS配置将其日志级别设置为“警告”。 - Buns of Aluminum
使用http而不是https,您是否会收到错误提示? - Cornel Creanga
编辑问题以添加更多信息,因为我无法在评论中全部添加。 - Buns of Aluminum
1个回答

2

Cornel Creanga帮助我找到了这个解决方案。我将我的应用程序切换到http,并开始在catalina.out文件中接收消息。我不知道为什么会受到影响,但确实如此。所有的消息都说套接字中有一个破损的管道。进一步调查显示jk_mod参与其中。

通过长时间的搜索,我发现我们的SysAdmin在TEST服务器上设置了套接字超时时间为10秒,但在DEV服务器上设置为5分钟,因此进行的大量搜索在到达TEST后导致超时。

SysAdmin在TEST上调整了配置,使得另一个工作进程(具有5分钟的超时时间)处理此上下文路径的调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接