Apache camel和SQS扩展客户端库

时间:2016-08-06 02:39:02

标签: java amazon-web-services apache-camel amazon-sqs

因此。如您所知,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());

sqsClientcamel-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。它可能对你有所帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

所以我找到的最好的解决方案是创建一个进程,首先从s3对象获取消息体并用它做一些事情。