[英]Amazon SQS Message Attributes
我無法正確添加屬性。 我使用的是 AWS 1.7 添加它們時,它們顯示在消息正文中,而不是屬性中。 當我登錄到 AWS 控制台時,我可以看到這一點。
我使用以下代碼添加消息屬性:
Message awsMessage = new Message();
Map<String, MessageAttributeValue> messageAttributes =
new HashMap<String, MessageAttributeValue>();
messageAttributes.put("email", new MessageAttributeValue()
.withDataType("String")
.withStringValue(email));
messageAttributes.put("data", new MessageAttributeValue()
.withDataType("String")
.withStringValue(newFileName));
messageAttributes.put("template", new MessageAttributeValue()
.withDataType("String")
.withStringValue(filename));
awsMessage.setMessageAttributes(messageAttributes);
我嘗試使用它來提取屬性:
List<Message> messages = SQSUtilityClass.getMessagesFromQueue(QUEUE_URL);
int size = messages.size();
Map<String, String> attributes = new HashMap<String, String>();
System.out.println("Size: "+size);
for(int x =0;x<size;x++){
Message message = messages.get(x);
//System.out.println(message.getBody());
attributes = message.getAttributes();
for(String key: attributes.keySet()){
System.out.println(key + " - "+ attributes.get(key));
}
}
盡管如此,當我通過 AWS 控制台查看時,我的屬性仍在消息正文中。
第一的。 您需要指定要通過消息接收哪些屬性。 以下代碼將接收屬性email
、 data
和template
(如您的示例):
final AmazonSQS sqs = // your code to get SQS instance
final String queue = // queue url
final List<Message> messages = sqs.receiveMessage(
new ReceiveMessageRequest(queue)
.withMessageAttributeNames("email", "data", "template")
).getMessages();
第二。 您應該使用message.getMessageAttributes()
而不是message.getAttributes()
:
final String email =
message.getMessageAttributes().get("email").getStringValue()
您可以使用以下庫生成 SQS。
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>amazon-sqs-java-messaging-lib</artifactId>
<version>${aws-messaging-lib-version}</version>
<type>jar</type>
</dependency>
這是要生成的示例代碼。
SendMessageRequest request = new SendMessageRequest();
request.withMessageAttributes(mapMessageAttributes(messageAttributes));
request.setMessageBody(message);
request.setQueueUrl(queueUrl);
sqsClient.sendMessage(request);
其中 mapMessageAttributes(messageAttributes) 返回一個 Map,而 sqsClient 是 AmazonSQSClient 的一個實例。
將屬性傳遞給 SQS 后,我將使用 JMS 庫通過將它們設置為 Spring DefaultMessageListenerContainer 來使用它們。
SQSConnectionFactory connectionFactory =
SQSConnectionFactory.builder()
.withRegion(AWSSQSUtils.getAWSRegion(region))
.withAWSCredentialsProvider(new DefaultAWSCredentialsProviderChain())
.withNumberOfMessagesToPrefetch(prefetchCount)
.withClientConfiguration((new ClientConfiguration())
.withMaxConnections(connectionsCount)
.withProxyHost(proxyHost)
.withProxyPort(proxyPort))
.build();
LOG.info("Connection factory initialized..");
// Create the connection.
SQSConnection connection = connectionFactory.createConnection();
// Create the transacted session with UNORDERED_ACKNOWLEDGE mode.
Session session = connection.createSession(false, SQSSession.UNORDERED_ACKNOWLEDGE);
Queue immediateQueue = session.createQueue(safInputQueueImmediate);
Queue normalQueue = session.createQueue(safInputQueueNormal);
LOG.info("Connection established and session created..");
//Create listeners
immediateListnerContainer = new
DefaultMessageListenerContainer();
immediateListnerContainer.setConnectionFactory(connectionFactory);
immediateListnerContainer.setMaxConcurrentConsumers(consumerConcurrency);
immediateListnerContainer.setSessionAcknowledgeMode(SQSSession.UNORDERED_ACKNOWLEDGE);
immediateListnerContainer.setCacheLevel(DefaultMessageListenerContainer.CACHE_CONSUMER);
immediateListnerContainer.setDestination(immediateQueue);
immediateListnerContainer.setMessageListener(
new StoreAndForwardListener(jobService, persistentMessagingDao));
immediateListnerContainer.setMaxMessagesPerTask(maxMessagesPerTask);
immediateListnerContainer.afterPropertiesSet();
immediateListnerContainer.start();
我使用的是程序化方法與聲明性方法,因為 SQS 支持無序知識,而 Spring JMS 尚不支持這種方法。
在 MessageListener 的 onMessage 方法中,您將收到一個 javax.jms.Message 對象,可以用來獲取所有消息屬性,如下所示。
Enumeration<String> headers = message.getPropertyNames();
while(headers.hasMoreElements()){
attributeName = headers.nextElement();
print(message.getStringProperty(attributeName))
}
希望有幫助。
我確實在 AWS 上開了一張票,其中一些屬性在傳輸過程中被丟棄了。 即我設置了 M 個屬性,並且只有 M-1 或 M-2 屬性使其成為 SQS。 一旦我有更新,我會在這里添加它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.