要實現從Amazon SQS(Simple Queue Service)訂閱訊息,並確保訊息的可靠投遞,可以使用AWS SDK for Java。以下是一個完整的示例程式碼,展示瞭如何從SQS佇列中接收訊息,並處理這些訊息以確保可靠性。
前提條件
- AWS SDK for Java:確保在你的專案中包含AWS SDK for Java的依賴項。
- AWS憑證:確保你的AWS憑證配置正確,以便能夠訪問SQS。
依賴項
在你的Maven專案中,新增以下依賴項到pom.xml
:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sqs</artifactId>
<version>2.17.94</version> <!-- 請使用最新版本 -->
</dependency>
示例程式碼
以下是一個示例Java程式碼,用於從SQS佇列中訂閱訊息,並確保訊息的可靠投遞:
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.*;
import java.util.List;
public class SqsExample {
public static void main(String[] args) {
Region region = Region.US_EAST_1; // 替換為你的AWS區域
String queueUrl = "https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue"; // 替換為你的佇列URL
SqsClient sqsClient = SqsClient.builder()
.region(region)
.credentialsProvider(ProfileCredentialsProvider.create())
.build();
receiveMessages(sqsClient, queueUrl);
sqsClient.close();
}
public static void receiveMessages(SqsClient sqsClient, String queueUrl) {
try {
while (true) {
// 接收訊息
ReceiveMessageRequest receiveRequest = ReceiveMessageRequest.builder()
.queueUrl(queueUrl)
.maxNumberOfMessages(10)
.waitTimeSeconds(20)
.build();
List<Message> messages = sqsClient.receiveMessage(receiveRequest).messages();
if (!messages.isEmpty()) {
for (Message message : messages) {
// 處理訊息
System.out.println("Message received: " + message.body());
// 確認訊息
deleteMessage(sqsClient, queueUrl, message);
}
}
}
} catch (SqsException e) {
e.printStackTrace();
}
}
private static void deleteMessage(SqsClient sqsClient, String queueUrl, Message message) {
try {
DeleteMessageRequest deleteRequest = DeleteMessageRequest.builder()
.queueUrl(queueUrl)
.receiptHandle(message.receiptHandle())
.build();
sqsClient.deleteMessage(deleteRequest);
System.out.println("Message deleted: " + message.messageId());
} catch (SqsException e) {
e.printStackTrace();
}
}
}
關鍵點解析
-
接收訊息:
- 使用
ReceiveMessageRequest
從SQS佇列中接收訊息。 maxNumberOfMessages
設定一次最多接收10條訊息。waitTimeSeconds
設定長輪詢時間為20秒。
- 使用
-
處理訊息:
- 遍歷接收到的訊息,並進行相應的處理。
- 在此示例中,僅列印訊息內容。
-
確認訊息:
- 使用
DeleteMessageRequest
確認訊息已處理,並從佇列中刪除該訊息。 - 這一步確保訊息被可靠地處理,並不會再次被接收。
- 使用
可靠投遞
確保訊息可靠投遞的關鍵在於:
- 長輪詢:使用長輪詢(
waitTimeSeconds
)減少空響應的次數,最佳化接收效率。 - 訊息刪除:在處理完訊息後立即刪除,確保訊息不會重複處理。