我有一个很大的问题。我已经使用Flex3 / Tomcat / BlazeDS / Spring编写了一个大型应用程序,该应用程序在本地开发时运行良好,当我部署到通用开发环境时效果很好,但是当部署到我们的测试环境时却经常失败。
当远程请求花费大量时间(超过20秒)时,故障似乎最容易发生。在我的开发服务器上,仅当请求花费很长时间(超过45秒)时才会发生错误。但是,错误有时也似乎立即发生(发送请求,但立即失败)。大多数错误也都有HTTP状态:错误502(错误网关),但有些错误只是说HTTP失败。
除了将war文件放入webapps目录外,我对BlazeDS并没有做任何特别的事情。通过https访问该应用程序。远程调用仅通过“目标”引用服务器。我们的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:管道损坏
警告:发送结束数据包时出错
java.net.SocketException:管道损坏
我在我的Apache日志中查找jk_mod,并看到一些调试信息,这些信息看起来像我发送的请求,然后是以下内容:
[调试] ajp_send_request :: jk_ajp_common.c(1592):重新发送请求正文(432) [调试] jk_shutdown_socket :: jk_connect.c(681):关于关闭套接字68 [调试] jk_shutdown_socket :: jk_connect.c(732):关闭套接字68并读取0个残留字节 [信息] ajp_connection_tcp_get_message :: jk_ajp_common.c(1150):(myTestServer)无法接收来自tomcat,网络问题或tomcat(xx.xx.xx.xx:xxxx)已关闭的响应头消息(errno = 11) [错误] ajp_get_reply :: jk_ajp_common.c(1962):(myTestServer)Tomcat关闭或拒绝连接。尚未发送答复给客户端(尚未) [info] ajp_service :: jk_ajp_common.c(2447):(myTestServer)向tomcat发送请求失败(可恢复),(尝试= 2) [错误] ajp_service :: jk_ajp_common.c(2466):(myTestServer)连接到tomcat失败。 [调试] ajp_reset_endpoint :: jk_ajp_common.c(743):(myTestServer)使用sd = 4294967295重置端点(套接字关闭) [调试] ajp_done :: jk_ajp_common.c(2905):为工作程序myTestServer回收连接池插槽= 0 [info] jk_handler :: mod_jk.c(2615):worker = myTestServer的服务错误= 0
[调试] ajp_send_request :: jk_ajp_common.c(1592):重新发送请求正文(432)
[调试] jk_shutdown_socket :: jk_connect.c(681):关于关闭套接字68
[调试] jk_shutdown_socket :: jk_connect.c(732):关闭套接字68并读取0个残留字节
[信息] ajp_connection_tcp_get_message :: jk_ajp_common.c(1150):(myTestServer)无法接收来自tomcat,网络问题或tomcat(xx.xx.xx.xx:xxxx)已关闭的响应头消息(errno = 11)
[错误] ajp_get_reply :: jk_ajp_common.c(1962):(myTestServer)Tomcat关闭或拒绝连接。尚未发送答复给客户端(尚未)
[info] ajp_service :: jk_ajp_common.c(2447):(myTestServer)向tomcat发送请求失败(可恢复),(尝试= 2)
[错误] ajp_service :: jk_ajp_common.c(2466):(myTestServer)连接到tomcat失败。
[调试] ajp_reset_endpoint :: jk_ajp_common.c(743):(myTestServer)使用sd = 4294967295重置端点(套接字关闭)
[调试] ajp_done :: jk_ajp_common.c(2905):为工作程序myTestServer回收连接池插槽= 0
[info] jk_handler :: mod_jk.c(2615):worker = myTestServer的服务错误= 0
Cornel Creanga帮助我找到了这个解决方案。我将应用程序切换为http,并开始在catalina.out文件中接收消息。我不知道为什么这会影响到它,但是确实如此。消息都说插座中的管道坏了。进一步调查显示,涉及到jk_mod。
通过大量搜索,我发现我们的SysAdmins在我们的TEST服务器上将服务器上的套接字超时设置为10秒,而在我们的DEV服务器上将套接字超时设置为5分钟,因此大量的搜索导致一旦到达TEST,它就会超时。 。
SysAdmins在TEST上调整了配置,以便另一个工作人员(超时5分钟)处理此上下文路径的调用。