2017-01-27 1 views
0

J'ai une application qui a besoin de suivre l'identifiant de transaction (ou quelque chose de similaire) d'un message envoyé à une file d'attente SQS.Comment obtenir une donnée identifiable lors de l'écriture dans une file d'attente AWS SQS?

Si j'envoie avec la classe suivante, comment puis-je obtenir des données identifiables en interrogeant la file d'attente?

@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 
    } 
} 

Répondre

1

SQS attribue un ID de message, mais la méthode queueMessagingTemplate.convertAndSend ne retourne rien. Si vous envoyez le message directement à l'aide du client SQS, vous obtiendrez un objet SendMessageResult sur lequel figurerait l'ID du message. Toutefois, l'ID de message SQS est un String pas un nombre, de sorte que vous ne seriez toujours pas en mesure de remplir votre contrat pour renvoyer un Long.

Si vous pouvez renvoyer un ID de message String au lieu d'un Long, le code ressemblerait à ceci:

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(); 
}