Apache Camel:Aws-S3 消费者开始因连接池超时而失败
Apache Camel: Aws-S3 consumer starts failing with connection pool timeout
我正在使用 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 在提供连接池时不自动执行此操作,或者如果我专门缺少任何配置。
任何连接池概念是 same.If 即使连接空闲也无法获得连接,在开发目的中我们需要通过检查连接是否空闲来显式调用 close()。例如:
if(con.isIdle()&& !con.closed()){
con.close();
}
只有这样我们才能得到连接 available.Even 尽管大多数框架最好从我们的 connectionFactory classes 中完成此代码。
编辑:
https://forums.aws.amazon.com/message.jspa?messageID=296676
这 link 将帮助您获得具体答案,因为您没有指定 S3Object 连接代码 class。
编辑 2:
在您的客户端配置中试试这个方法
public ClientConfiguration withConnectionMaxIdleMillis(long connectionMaxIdleMillis)
这可能会解决您的错误,因为如果池中有空闲连接且未被重用,它会自动关闭连接。
Camel Consumer class 为每个 "Key" 打开连接并从中创建一个交换。此交换被转发到路由进行处理,但从未自动关闭,即使在调用 "Stop" 时也是如此。结果,连接池用完了可用连接。需要做的是从交换中提取 S3ObjectInputStream 并关闭它。
S3ObjectInputStream s3InputStream = exchange.getIn().getBody(S3ObjectInputStream.class);
s3InputStream.close();
答案与其他人建议的关闭连接非常接近。但正如所解释的,骆驼特定的答案是预期的,并且解释了为什么骆驼不自己处理这个问题。
我正在使用 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 在提供连接池时不自动执行此操作,或者如果我专门缺少任何配置。
任何连接池概念是 same.If 即使连接空闲也无法获得连接,在开发目的中我们需要通过检查连接是否空闲来显式调用 close()。例如:
if(con.isIdle()&& !con.closed()){
con.close();
}
只有这样我们才能得到连接 available.Even 尽管大多数框架最好从我们的 connectionFactory classes 中完成此代码。
编辑:
https://forums.aws.amazon.com/message.jspa?messageID=296676
这 link 将帮助您获得具体答案,因为您没有指定 S3Object 连接代码 class。
编辑 2:
在您的客户端配置中试试这个方法
public ClientConfiguration withConnectionMaxIdleMillis(long connectionMaxIdleMillis)
这可能会解决您的错误,因为如果池中有空闲连接且未被重用,它会自动关闭连接。
Camel Consumer class 为每个 "Key" 打开连接并从中创建一个交换。此交换被转发到路由进行处理,但从未自动关闭,即使在调用 "Stop" 时也是如此。结果,连接池用完了可用连接。需要做的是从交换中提取 S3ObjectInputStream 并关闭它。
S3ObjectInputStream s3InputStream = exchange.getIn().getBody(S3ObjectInputStream.class);
s3InputStream.close();
答案与其他人建议的关闭连接非常接近。但正如所解释的,骆驼特定的答案是预期的,并且解释了为什么骆驼不自己处理这个问题。