Java Apache Camel:Aws-S3使用者开始失败,连接池超时

Java Apache Camel:Aws-S3使用者开始失败,连接池超时,java,amazon-s3,apache-camel,Java,Amazon S3,Apache Camel,我使用AWS-S3 consumer定期轮询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: Una

我使用AWS-S3 consumer定期轮询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在提供连接池时不自动执行此操作,或者我缺少任何特定的配置。

任何连接池概念相同的地方。如果您无法获得连接,即使连接处于空闲状态,出于开发目的,我们需要显式调用close()通过检查连接是否空闲。对于exmaple:

 if(con.isIdle()&& !con.closed()){
con.close();
}
然后只有我们才能获得可用的连接。即使大多数框架都这样做,但最好从我们的connectionFactory类中完成这段代码

编辑:

此链接将帮助您获得具体答案,因为您没有指定S3Object连接类的代码

编辑2:

在ClientConfiguration中尝试此方法

public ClientConfiguration withConnectionMaxIdleMillis(long connectionMaxIdleMillis)

这可能会解决您的错误,因为如果池中存在空闲连接且未重用,它会自动关闭连接。

骆驼消费者类会为每个“密钥”打开连接,并从中创建一个交换。此交换被转发到路由进行处理,但从未自动关闭,即使在调用“停止”时也是如此。因此,连接池将耗尽可用连接。需要做的是从exchange中提取S3ObjectInputStream并关闭它

S3ObjectInputStream s3InputStream = exchange.getIn().getBody(S3ObjectInputStream.class);
s3InputStream.close();

答案与其他人的建议非常接近,即关闭连接。但正如前面所解释的,Camel需要特定的答案,并解释为什么Camel不能自己处理这个问题。

我理解这一点,但在这种情况下,您需要掌握连接实例。对于普通Java请求,我当然会这样做,但在本例中,我正在寻找特定于Camel AWS-S3组件的内容。请提供S3Object及其实例的代码?不幸的是,我使用的版本不提供此方法。由于某些限制,我无法更新版本。您的答案不完整。您的路由定义是什么?您在哪里关闭流?您能在这里发布整个与骆驼相关的代码块吗?