gpt4 book ai didi

java - Apache Camel : Aws-S3 consumer starts failing with connection pool timeout

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:20:35 26 4
gpt4 key购买 nike

我使用 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]

据我了解,原因应该是消费者耗尽了池中的可用连接,因为它在每次轮询时都使用一个新连接。我需要知道的是如何在每次轮询后释放资源以及为什么组件本身不这样做。

Camel 版本: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 对象绑定(bind)到 Camel 上下文,并提供给基于 AWS-S3 组件的 Camel 路由。现在,Camel 自行管理此资源。

必需的解决方案:我期待特定于 Camel Aws-S3 消费者的解决方案,而不是通用的 Java 解决方案,因为我知道连接在完成任务后应关闭,以便释放并再次使用。令人困惑的是,为什么 Camel 在提供连接池时没有自动执行此操作,或者如果我特别缺少任何配置。

最佳答案

Camel Consumer 类为每个“Key”打开连接并从中创建一个交换。此交换被转发到路由进行处理,但从未自动关闭,即使在调用“停止”时也是如此。结果,连接池用完了可用连接。需要做的是从交换中提取 S3ObjectInputStream 并关闭它。

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

答案与其他人建议的关闭连接非常接近。但正如所解释的, Camel 特定的答案是预期的,并且解释了为什么 Camel 不自己处理这个问题。

关于java - Apache Camel : Aws-S3 consumer starts failing with connection pool timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32136087/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com