2017年5月4日 星期四

在 Java 傳送訊息給 Amazon SQS

Amazon SQS 是 Amazon 的其中一個訊息服務
感覺上其實有點像是劣化版的 Kinesis。
Anyway,總之就是一種用來傳送訊息的方法,所以這篇要來簡要紀錄一下怎麼從 Java 控制它。

前置工作

在使用 Java 控制 SQS 以前,需要先知道 SQS Queue 的網址
不過當然實際上這一切都可以用程式控制,例如透過程式建立 SQS Queue,然後取得 Queue 的網址
但在這邊先把問題簡化一些,假設 SQS Queue 已經手動建立好、並且權限也都設定好了
程式只先對 SQS 傳送訊息,並且從另一段程式接收傳送的訊息。

Maven 設定

假設要使用 AWS SDK,然後版本假定是 1.10.77
(目前最新版是 1.11.125,不過暫時我還是習慣用這個版本)

在 dependencyManagement 裡加入以下的 AWS SDK 的 BOM。

<dependencies>
	<dependency>
		<groupId>com.amazonaws</groupId>
		<artifactId>aws-java-sdk-bom</artifactId>
		<version>1.10.77</version>
		<type>pom</type>
		<scope>import</scope>
	</dependency>
</dependencies>

接著在 dependencies 裡加入 SQS 的函式庫。

<dependency>
	<groupId>com.amazonaws</groupId>
	<artifactId>aws-java-sdk-sqs</artifactId>
</dependency>
傳送訊息

傳送訊息的範例程式碼如下:

BasicAWSCredentials awsCreds = new BasicAWSCredentials(
        "YOUR_ACCESS_KEY", "YOUR_ACCESS_CREDENTIAL");
AmazonSQS sqs = new AmazonSQSClient(awsCreds);
sqs.setRegion(Region.getRegion(Regions.US_EAST_1));

sqs.sendMessage(new SendMessageRequest(
        "YOUR_SQS_URL", "message content blah blah blah.."));

其中 YOUR_ACCESS_KEY 和 YOUR_ACCESS_CREDENTIAL 是存取的金鑰,可以在 IAM 裡面建立
YOUR_SQS_URL 就是 Queue 的網址~。

另外需要稍微注意的地方是,SQS 的 SDK 好像沒有支援傳送 Binary 的感覺,因為參數只支援字串
因此如果要傳送 Binary,可能必須先用 Base64 或者 HEX 之類的方法轉成字串。

接收訊息

接收訊息的範例程式碼如下,其實流程也是蠻類似的:

BasicAWSCredentials awsCreds = new BasicAWSCredentials(
        "YOUR_ACCESS_KEY", "YOUR_ACCESS_CREDENTIAL");
AmazonSQS sqs = new AmazonSQSClient(awsCreds);
sqs.setRegion(Region.getRegion(Regions.US_EAST_1));
    
ReceiveMessageRequest receiver = new ReceiveMessageRequest("YOUR_QUEUE_URL");

List<Message> messages = sqs.receiveMessage(receiver).getMessages();
log.info("Number of message received: {}", messages.size());

不過實驗時看起來,即使 Queue 裡面已經有一堆 Message,一次好像還是只會拿到 1 個而已
所以 Receiver 顯然需要重複一直執行,可能透過 Runnable/Callable 或者迴圈來進行。

參考資料
  1. Using JMS with Amazon SQS
  2. SimpleQueueServiceSample.java

沒有留言: