因此。如您所知,AWS Simple Queue Service对邮件的大小有一些限制。还有一个名为扩展客户端库的library可帮助我们通过使用S3存储桶来避免此限制。我还使用Apache Camel来管理我的队列。
我想我只是误解了这个概念,但我有问题要让Apache Camel和Extended SQS Library协同工作。
首先,我定义了一条新路线
from("aws-sqs://queue?amazonSQSClient=#sqsClient" +
"&maxMessagesPerPoll=10" +
"&deleteAfterRead=false" +
"&concurrentConsumers=10" +
"&attributeNames=All" +
"&messageAttributeNames=All"
).log(body());
sqsClient
在camel-context.xml
<bean name="sqsClient" class="com.amazonaws.services.sqs.AmazonSQSAsyncClient">
<constructor-arg>
<bean class="com.amazonaws.auth.BasicAWSCredentials">
<constructor-arg value="${access.key}"/>
<constructor-arg value="${secret.key}"/>
</bean>
</constructor-arg>
<property name="region" ref="awsRegion"/>
</bean>
这一点处理高达256 kb的消息没有问题。
让我们走得更远。扩展SQS库检测消息是否大于256 kb并在S3存储中引用该文件。并且简单地稍后获取它。
[ “com.amazon.sqs.javamessaging.MessageS3Pointer”,{ “s3BucketName”: “测试斗ascelhem”, “s3Key”: “b022dfd8-ed40-4213-a41e-5a0e82090ef4”}]
在客户端能够使用它之前有一些预先配置:
首先,我们设置SQS扩展客户端配置,并启用大型有效负载支持。
ExtendedClientConfiguration extendedClientConfig = new ExtendedClientConfiguration().withLargePayloadSupportEnabled(s3, s3BucketName);
最后
AmazonSQS sqsExtended = new AmazonSQSExtendedClient(new AmazonSQSClient(credentials), extendedClientConfig);
Region sqsRegion = Region.getRegion(Regions.US_WEST_1);
sqsExtended.setRegion(sqsRegion);
我可以通过Spring DSL配置它还是应该获取消息并在处理器内部获取消息体?
接下来,它是一种帮助我们获取邮件正文的方法。
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl);
List<Message> messages = sqsExtended.receiveMessage(receiveMessageRequest).getMessages();
Apache骆驼是否会以某种方式覆盖getMessage?因为在app中我们可以通过调用方法body()
来获取消息体。
如果有机会以这种方式配置Apache Camel以便它可以处理非常大的消息,那么行new ExtendedClientConfiguration()
.withLargePayloadSupportEnabled(s3, s3BucketName);
会让我很困惑,因为我不知道如何在xml中调用静态方法文件。
最后一行
<bean name="sqsClient" class="com.amazonaws.services.sqs.AmazonSQSAsyncClient">
这里我们使用AmazonSQSAsyncClient
,但正如我之前提到的,扩展客户端库通过AmazonSQS
...界面进行初始化?所以,我完全陷入困境。
此外,我还使用了这个库example。它可能对你有所帮助。
感谢。
答案 0 :(得分:0)
所以我找到的最好的解决方案是创建一个进程,首先从s3对象获取消息体并用它做一些事情。