如何在写入 AWS SQS 队列时获取一段可识别的数据?

How to get a piece of identifiable data when writing to an AWS SQS Queue?

我有一个应用程序需要跟踪发送到 SQS 队列的消息的事务 ID(或类似的东西)。

如果我发送以下class,我如何通过查询队列获得一些可识别的数据?

@Component
public class SqsQueueDao {

    private static final Logger LOGGER = LoggerFactory.getLogger(SqsQueueDao.class);
    private final QueueMessagingTemplate queueMessagingTemplate;

    @Autowired
    @Qualifier("awsClient")
    AmazonSQSAsyncClient amazonSQSAsyncClient;

    public SqsQueueDao(AmazonSQSAsync amazonSQSAsyncClient) {
        this.queueMessagingTemplate = new QueueMessagingTemplate(amazonSQSAsyncClient);
    }

    //TODO: implement a strategy for identifying the message id
    public Long send(String queueName, String message) {
        queueMessagingTemplate.convertAndSend(queueName, MessageBuilder.withPayload(message).build());
        //return some long identifying data
    }
}

SQS 分配消息 ID,但 queueMessagingTemplate.convertAndSend 方法不 return 任何东西。如果您直接使用 SQS 客户端发送消息,那么您将获得一个 SendMessageResult 对象,其中包含消息 ID。但是 SQS 消息 ID 是 String 而不是数字,因此您仍然无法履行与 return 和 Long 的合同。

如果您可以 return String 消息 ID 而不是 Long,那么代码将如下所示:

public String send(String queueName, String message) {
    // Could probably cache this URL instead of looking up each time
    String queueUrl = amazonSQSAsyncClient.getQueueUrl(queueName).getQueueUrl();

    SendMessageResult result = amazonSQSAsyncClient.sendMessage(queueUrl, message);
    return result.getMessageId();
}