Simple Message Queue (旧称:MNS) を使用して、配信レポートを受信します。
前提条件
Alibaba Cloud アカウントと AccessKey ペアが作成されていること。詳細については、「AccessKey ペアの作成」をご参照ください。
MNS キューが、dybaseapi.ap-southeast-1.aliyuncs.com および 1493622401794734.mns.ap-southeast-1.aliyuncs.com のドメイン名にアクセスできること。
配信レポートのべき等性は保証されません。配信レポートを受信した後、データの正確性と一貫性を確保するために適切な措置を講じることを推奨します。
リクエストパラメーター
パラメーター | タイプ | 例 | 説明 |
To | String | 8521234**** | 配信レポートを受信する携帯電話番号。 |
Status | String | 1 | メッセージのステータス。有効な値は次のとおりです。
|
MessageId | String | 123456789**** | 配信レポートの ID。 |
SmsSize | String | 1 | メッセージ数。 長文メッセージは複数のメッセージに分割されます。 |
SendDate | String | Thu, 25 Nov 2021 10:27:00 +0800 | メッセージがキャリアに送信された時刻。 |
ReceiveDate | String | Thu, 25 Nov 2021 10:27:33 +0800 | キャリアから配達領収書を受領した時間。 |
ErrorCode | String | success | エラーコード。 |
ErrorDescription | String | success | エラーメッセージ。 |
例
{
"To" : "8521234****",
"SendDate" : "Thu, 25 Nov 2021 10:27:00 +0800",
"ReceiveDate" : "Thu, 25 Nov 2021 10:27:33 +0800",
"Status" : "1",
"SmsSize":"1",
"ErrorCode" : "success",
"ErrorDescription" : "success",
"MessageId" : "123456789****"
}デモのダウンロード
詳細については、「Simple Message Queue コンシューマーデモ」をご参照ください。ご希望のプログラミング言語のデモと SDK をダウンロードしてください。以下の手順では、Java を例として使用します。
デモをダウンロードした後、一部の JAR ファイルは
libディレクトリにあります。それらを右クリックし、[ライブラリとして追加] を選択して、ライブラリとして追加する必要があります。以下の画像をご参照ください。pom.xmlファイルで Maven 依存関係を見つけて、Alibaba Cloud SDK for Java をインストールできます。

パラメーター設定
サンプルコードを使用する前に、以下のパラメーターを設定する必要があります。
AccessKey ペアの設定
サンプルコード
受信する配信レポートのコンテンツは、dealMessage メソッドによって処理されます。このメソッド内に、これらのメッセージを処理するためのビジネスロジックを記述できます。
// ドキュメントで指定されたフォーマットに従って、メッセージ本文を解析します
String arg = (String) contentMap.get("arg");
// ここにビジネスロジックを記述しますarg は、コールバックメッセージ本文からのパラメーターを表します。その値には、To、Status、MessageId、SmsSize、SendDate、ReceiveDate、ErrorCode、ErrorDescription が含まれます。
package com.alicom.mns.sample;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.alicom.mns.tools.DefaultAlicomMessagePuller;
import com.alicom.mns.tools.MessageListener;
import com.aliyun.mns.model.Message;
import com.google.gson.Gson;
/**
* This is for receiving messages from Alibaba Cloud Communications services only and cannot be used for other services
*/
public class ReceiveDemo {
private static Log logger=LogFactory.getLog(ReceiveDemo.class);
static class MyMessageListener implements MessageListener{
private Gson gson=new Gson();
@Override
public boolean dealMessage(Message message) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// メッセージからのキー値
System.out.println("message receiver time from mns:" + format.format(new Date()));
System.out.println("message handle: " + message.getReceiptHandle());
System.out.println("message body: " + message.getMessageBodyAsString());
System.out.println("message id: " + message.getMessageId());
System.out.println("message dequeue count:" + message.getDequeueCount());
System.out.println("Thread:" + Thread.currentThread().getName());
try{
Map<String,Object> contentMap=gson.fromJson(message.getMessageBodyAsString(), HashMap.class);
// ドキュメントに記載されている特定の形式に従ってメッセージ本文を解析します。
String arg = (String) contentMap.get("arg");
// ここにビジネスロジックを追加します。
}catch(com.google.gson.JsonSyntaxException e){
logger.error("error_json_format:"+message.getMessageBodyAsString(),e);
// 理論的には、形式エラーは発生しません。不正な形式のメッセージが発生した場合は、再配信されて繰り返しエラーが発生するのを防ぐために、そのメッセージを削除してください。
return true;
} catch (Throwable e) {
// ご自身のコードによって例外が発生した場合は、false を返してください。これにより、メッセージが削除されるのを防ぎ、リトライポリシーに従って再配信されるようになります。
return false;
}
// メッセージが正常に処理された場合は、true を返します。SDK は MNS 削除メソッドを呼び出して、キューからメッセージを削除します。
return true;
}
}
public static void main(String[] args) throws Exception, ParseException {
DefaultAlicomMessagePuller puller=new DefaultAlicomMessagePuller();
// 非同期スレッドプール、タスクキューのサイズ、およびデータがない場合のスレッドのスリープ時間を設定します。
puller.setConsumeMinThreadSize(6);
puller.setConsumeMaxThreadSize(16);
puller.setThreadQueueSize(200);
puller.setPullMsgThreadSize(1);
// サーバーサイドデバッグのためにこれを有効にします。パフォーマンスに影響するため、通常操作時には無効にする必要があります。
puller.openDebugLog(false);
// ローカル環境変数から AccessKey ID と AccessKey Secret を取得します。
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
/*
* messageType と queueName を必要なメッセージタイプと対応するキュー名に置き換えます。
* サポートされているコールバックメッセージタイプ:
* 1: SmsReport: SMS 配信レポート
* 2: SmsUp: モバイル発信メッセージ
* 3: GlobeSmsReport: 国際 SMS 配信レポート
*/
String messageType="<MESSAGE_TYPE>"; // これをメッセージタイプに置き換えます。SmsReport がサポートされています。
String queueName="<QUEUE_NAME>"; // コンソールで機能を有効にした後、対応する queueName をページで確認できます。例: Alicom-Queue-******-SmsReport。
puller.startReceiveMsg(accessKeyId,accessKeySecret,messageType,queueName,new MyMessageListener());
}
}デモ実行後の出力:

