通过本文,您可以了解号码隐私保护服务Java语言的消息回执示例,同时下载相应的Java SDK安装包,使用SDK拉取轻量消息队列(原MNS)回执消息。

前提条件

环境部署

确认所需信息

建议您确认以下配置SDK所需的信息:

  • 需使用的回执消息类型。请参见回执消息类型了解选择。

  • 需拉取回执消息的隐私号码及其归属的号码池。隐私号码即X号码,可在号码管理页面查看。号码池可在号码池管理页面查看。

  • 该回执消息类型下,号码池关联的队列名称。可在号码隐私保护控制台概览页面,下拉至云通信消息接收区域,管理或查看对应回执消息类型的号码管理信息内容,即可查看该号码池关联的队列名称,若没有关联队列,则使用默认队列。

  • AccessKey ID和AccessKey Secret的环境变量名。

SDK说明

SDK下载

SDK下载:Java 轻量消息队列(原MNS)SDK

SDK使用说明

  1. 下载SDK,并解压SDK包。

  2. 使用IntelliJ IDEA等软件打开解压后的SDK项目,并检查项目使用的版本是否和JDK版本一致,操作请参见使用Java SDK常见问题

  3. 根据业务需要及确认好的信息,修改ReceiveDemo.java文件中,TODO注释后的代码,具体请参见示例代码

    文件路径:alicom_mns_java_sdk\msg_demo\alicom-mns-receive-samples\src\main\java\com\alicom\mns\sample\ReceiveDemo.java

  4. 修改完毕后,单击运行,运行后SDK项目启动,拉取回执消息。

示例

示例说明

  • 示例使用的回执消息类型为:SecretReport(呼叫结束后话单报告)。

  • 示例使用的队列名称为:Alicom-Queue-10322476********-SecretReport。

  • 示例通过AccessKey环境变量读取访问凭证。AccessKey ID和AccessKey Secret的环境变量名为:ALIBABA_CLOUD_ACCESS_KEY_ID 、ALIBABA_CLOUD_ACCESS_KEY_SECRET。

示例代码

说明

您需要根据确认好的所需信息,修改TODO注释后的代码,请重点关注示例42、45、76、77、110、111行。

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 com.alicom.mns.tools.DefaultAlicomMessagePuller;
import com.alicom.mns.tools.MessageListener;
import com.aliyun.mns.model.Message;
import com.google.gson.Gson;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 只能用于接收云通信的消息,不能用于接收其他业务的消息
 * 短信上行消息接收demo
 */
public class ReceiveDemo {

    private static Logger logger = Logger.getLogger(ReceiveDemo.class.getName());
	
    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);

		//TODO 根据文档中具体的消息格式进行消息体的解析
                String arg = (String) contentMap.get("arg");

                //TODO 这里开始编写您的业务代码
                System.out.println("Test SecretReport Message Success!");

            }catch(com.google.gson.JsonSyntaxException e){
            	logger.log(Level.SEVERE, "error_json_format:"+message.getMessageBodyAsString(),e);
		//理论上不会出现格式错误的情况,所以遇见格式错误的消息,只能先delete,否则重新推送也会一直报错
		return true;
            } catch (Throwable e) {
		//您自己的代码部分导致的异常,应该return false,这样消息不会被delete掉,而会根据策略进行重推
		return false;
	    }

	    //消息处理成功,返回true, SDK将调用MNS的delete方法将消息从队列中删除掉
	    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);

	//TODO 此处需要替换成开发者自己的AK信息,强烈建议您通过环境变量读取,不要把AK信息保存到工程代码中,否则可能导致AK泄露,威胁您账号下的所有资源的安全。
        //此处以设置AccessKey ID和AccessKey Secret的环境变量名为:ALIBABA_CLOUD_ACCESS_KEY_ID 、ALIBABA_CLOUD_ACCESS_KEY_SECRET为例。
	String accessKeyId=System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
	String accessKeySecret=System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");

	/*
	* TODO 将messageType和queueName替换成您需要的消息类型名称和对应的队列名称
	* 云通信产品下所有的回执消息类型:
	* 短信服务
	* 1:短信回执:SmsReport,
	* 2:短息上行:SmsUp
	* 3:国际短信回执:GlobeSmsReport
	*
	* 号码隐私保护服务
	* 1.呼叫发起时话单报告:SecretStartReport
	* 2.呼叫响铃时报告:SecretRingReport
	* 3.呼叫接听时报告:SecretPickUpReport
	* 4.呼叫结束后话单报告:SecretReport
	* 5.录音状态报告:SecretRecording
	* 6.录音ASR状态报告:SecretAsrReport
	* 7.短信内容报告:SecretSmsIntercept
	* 8.计费通话报告:SecretBillingCallReport
	* 9.计费短信报告:SecretBillingSmsReport
	* 10.异常号码状态推送:SecretExceptionPhoneReport
	* 11.放音录音状态报告:SecretRingRecording
	* 12.电商物流详情报告:SmartLogisticsReport
	* 13.号码管理信息:NumberManagementReport
	*
	* 语音服务
	* 1.呼叫记录消息:VoiceReport
	* 2.呼叫中间状态消息:VoiceCallReport
	* 3.录音记录消息:VoiceRecordReport
	* 4.实时ASR消息:VoiceRTASRReport
	* 5.融合通信呼叫记录消息:ArtcCdrReport
	* 6.融合通信呼叫中间状态:ArtcTempStatusReport
	*/
	String messageType="SecretReport";//此处应该替换成相应产品的消息类型
	String queueName="Alicom-Queue-10322476********-SecretReport";//在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName,格式类似Alicom-Queue-xxxxxx-SmsReport

	puller.startReceiveMsg(accessKeyId,accessKeySecret, messageType, queueName, new MyMessageListener());
    }
}

结果验证

  1. 运行demo项目后,查看是否有符合条件的回执消息被拉取到,如果有,则验证成功。如下:

    image

  2. 若未拉取到回执消息,可能是由于没有符合条件的消息导致,可以制造几条符合条件的消息测试验证。步骤如下:

    • 制造前,需确认条件如下:

      • 使用的消息类型。

      • 待测试的号码池及对应的队列名称。检查该号码池是否被该队列关联。

      • 待测试的隐私号码,需要归属待测试号码池下。

    • 拿示例代码中使用的消息类型为SecretReport,队列名称为Alicom-Queue-10322476********-SecretReport,号码池为FC100000165******,隐私号码为16727******为例:

      1. 运行demo项目。

      2. 为该隐私号码,即X号码创建绑定关系。请参见号码绑定

      3. 使用绑定关系中的B号码、N号码或者G组号码拨打X号码,并使用A号码接听X号码的来电。

      4. 测试沟通完毕,挂断电话。

      5. 此时产生了一条呼叫记录,即可被SecretReport消息类型拉取到回执消息的记录。请参见查询呼叫详情查看呼叫记录。

      6. 查看demo项目的回执消息拉取结果,符合预期,验证成功。

        image

常见问题

运行demo后,无法拉取到回执消息

  • 检查demo代码中设置的信息,与待测试信息是否一致,修正不一致的信息。

  • 检查后,请参见查询呼叫详情查看呼叫记录,确认是否有demo启动后新产生的呼叫记录,若没有,请参见结果验证-2制造,重新验证结果。

运行demo时,提示java: 错误: 不支持发行版本 X或者java: Compilation failed: internal java compiler error问题

需要您检查项目使用的版本是否和JDK版本一致,操作方式请参见使用Java SDK常见问题