【发布时间】:2015-11-15 03:34:12
【问题描述】:
我正在使用 AWS-S3 消费者定期轮询 S3 上某个位置的文件。在轮询一定次数后,它开始失败并出现给定的异常,
Will try again at next poll. Caused by:[com.amazonaws.AmazonClientException - Unable to execute HTTP request:
Timeout waiting for connection from pool]
com.amazonaws.AmazonClientException: Unable to execute HTTP request:Timeout waiting for connection from pool
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:376) ~[aws-java-sdk-1.5.5.jar:na]
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:202) ~[aws-java-sdk-1.5.5.jar:na]
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3037) ~[aws-java-sdk-1.5.5.jar:na]
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3008) ~[aws-java-sdk-1.5.5.jar:na]
at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:531) ~[aws-java-sdk-1.5.5.jar:na]
at org.apache.camel.component.aws.s3.S3Consumer.poll(S3Consumer.java:69) ~[camel-aws-2.12.0.jar:2.12.0]
at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:187) [camel-core-2.12.0.jar:2.12.0]
at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:114) [camel-core-2.12.0.jar:2.12.0]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_60]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) [na:1.7.0_60]
据我了解,原因应该是消费者耗尽了池中的可用连接,因为它每次轮询都使用一个新连接。我需要知道的是如何在每次轮询后释放资源,以及为什么组件本身不这样做。
骆驼版:2.12
编辑: 我修改了消费者以选择具有特定连接超时、maxconnections、maxerrorretry 和 sockettimeout 的自定义 S3 客户端,但没有用。结果是一样的。
S3 客户端配置:
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setMaxConnections(50);
clientConfiguration.setConnectionTimeout(6000);
clientConfiguration.setMaxErrorRetry(3);
clientConfiguration.setSocketTimeout(30000);
main.bind("s3Client", new AmazonS3Client(awsCredentials, clientConfiguration));
名为“s3Client”的 AmazonS3Client 对象绑定到 Camel 上下文,并提供给基于 Camel AWS-S3 组件的路由。现在,Camel 自己管理这个资源。
所需的解决方案:我期待特定于 Camel Aws-S3 消费者的解决方案,而不是通用 Java 解决方案,因为我知道连接应在其任务完成后关闭,以便再次释放和使用。令人困惑的是为什么 Camel 在提供连接池时不会自动执行此操作,或者如果我特别缺少任何配置。
【问题讨论】:
标签: java amazon-s3 apache-camel