首页 > 解决方案 > 使用 PCF 服务代理配置自定义命名的 SQS 队列

问题描述

我正在尝试创建一个新队列,但是在使用时

cf create-service aws-sqs standard my-q

AWS 中的队列名称是自动分配的,只是一个由随机字母和数字组成的 id。

这在使用普通的 java 客户端时很好。但是,我们想使用spring-cloud-aws-messaging( @SqsListenerannotation),因为它为我们提供了开箱即用的删除策略,以及一种扩展可见性的方法,以便我们可以轻松地实现重试。

    @SqsListener(value = "my-q", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
    public void listen(TestItem item, Visibility visibility) {
        log.info("received message: " + item);

        //do business logic
        //if call fails
        visibility.extend(1000);
        //throw exception

        //if no failure, message will be dropped
    }

注解上的队列名是声明的,所以我们不能在应用程序上读取PCF注入的VCAP_SERVICE环境变量后动态改变它。

我们能想到的唯一替代方法是使用反射来设置注释值的可访问性,并将值设置为 VCAP_SERVICE 上的名称,但这很讨厌,我们希望尽可能避免它。

有没有办法将队列的名称更改为特定于创建的名称?表明这是可能的,如下所示:

cf create-service aws-sqs standard my-q -c '{ "CreateQueue": {  "QueueName": “my-q”, "Attributes": { "MaximumMessageSize": "1024"} } }'

但是,这不起作用。它返回:

不正确的用法:为 -c 标志提供的配置无效。请提供有效的 JSON 对象或包含有效 JSON 对象的文件的路径。

如何在创建队列时设置名称?或者实现我的最终目标的唯一方法是使用反射?

编辑:正如 Daniel Mikusa 所指出的,双引号不是真正的双引号,这导致了错误。该命令现在成功,但它不会创建具有预期名称的队列。我现在想知道是否需要设置此名称bind-service。该命令也有一个-c选项,但我找不到任何文档来支持哪些参数可用于aws-sqs服务。

标签: springamazon-sqscloud-foundryaws-java-sdkspring-cloud-aws

解决方案


推荐阅读