2012-10-22 48 views
3

我有JavaFX客户端的弹簧应用程序,并且我得到此异常时,它会在另一个线程中运行时调用方法用于后台任务) - 这不是主要的JavaFx线程。org.springframework.remoting.RemoteAccessException:从另一个线程启动任务时,无法访问HTTP调用程序远程服务

org.springframework.remoting.RemoteAccessException: Could not access HTTP invoker remote service at [http://localhost:8080/server/service/security/UserGroupService]; 
nested exception is java.net.SocketTimeoutException: Read timed out 
at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.convertHttpInvokerAccessException(HttpInvokerClientInterceptor.java:211) 
at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:144) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
at $Proxy63.batchJobSetAccessRightsToConsultant(Unknown Source) 
at client.view.control.reporting.AccessRightsBatchDialog$1Local$744.invoke$(AccessRightsBatchDialog.fx:374) 
at com.sun.javafx.functions.Function1.invoke(Function1.java:44) 
at com.sun.javafx.functions.Function1.invoke$(Function1.java:38) 
at client.async.AsyncTask.taskRun(AsyncTask.fx:71) 
at client.async.AsyncTaskHelper.run(AsyncTaskHelper.java:32) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:662) 
    Caused by: java.net.SocketTimeoutException: Read timed out 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(SocketInputStream.java:129) 
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 
at java.io.BufferedInputStream.read(BufferedInputStream.java:237) 
at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78) 
at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106) 
at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116) 
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.readLine(MultiThreadedHttpConnectionManager.java:1413) 
at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973) 
at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735) 
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1098) 
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398) 
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) 
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) 
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323) 
at org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor.executePostMethod(CommonsHttpInvokerRequestExecutor.java:195) 
at org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor.doExecuteRequest(CommonsHttpInvokerRequestExecutor.java:129) 
at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.executeRequest(AbstractHttpInvokerRequestExecutor.java:136) 
at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:191) 
at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:173) 
at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:141) 
... 11 more 

我的最后一次更改,我怀疑,这样一个原因 - 因为我需要从HTTP会话用户信息,在每个服务代理,我通过这个httpInvokerRequestExecutor豆:

<bean id="httpInvokerRequestExecuter" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor" > 

for example: 

<bean id="testServiceProxy" 
    class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean"> 
    <property name="serviceUrl" value="${remoteUrl}/service/test/TestService" /> 
    <property name="serviceInterface" 
     value="common.service.test.TestService" /> 
    <property name="httpInvokerRequestExecutor" ref="httpInvokerRequestExecuter" /> 
</bean> 

使用在主线程中运行的方法,这似乎永远不会发生。

所有关于引起的和可能的解决方案的想法都非常受欢迎。

回答

2

提高httpInvokerRequestExecuter的读取超时时间。默认值是一分钟。你可以增加它,也可以设置为0,这意味着它永远不会超时(可能不是一个好主意,但对测试很有用)。

bean定义删除readTimeout(或将其设置为可申请数量):

<bean id="httpInvokerRequestExecuter" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecuto‌​r" > 
    <property name="readTimeout" value="0" /> 
</bean> 
+0

我把我们的所有服务器上的这些异常。现在我必须找到原因,我在本地进行测试,并发布该堆栈跟踪。是的,我试图连接到UserGroupService(我刚刚写的TestService的代理作为示例,对于所有其他代理(包括UserGroupS ...)都是如此)。通常在任务运行一分钟后,通常会收到异常。事情是,在添加调用者bean之前,这不会发生。我们没有在任何地方对tomcat进行任何更改:/ – Julia

+0

您可以尝试增加'httpInvokerRequestExecuter'的读取超时时间。 默认值是一分钟。你可以增加它,也可以设置为0,这意味着它永远不会超时(可能不是一个好主意,但对测试很有用)。 <豆ID = “httpInvokerRequestExecuter” 类= “org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor”> <属性名= “readTimeout” 值= “0”/> –

+0

哎我一派到相同的溶液中,现在测试,似乎它的工作!我还必须更改连接管理器以使其成为多线程。如果你愿意,你的答案写为答案不是评论,所以我可以接受。感谢帮助! – Julia

相关问题