开启消息通道(首先要开通MNS权限,不然会启动报错,报无权限)
开通MNS权限的地址:https://help.aliyun.com/document_detail/147912.html?spm=5176.10695662.1996646101.searchclickresult.385c7538XXq1yz
(开通MNS的同时也要获取队列的key值)
package phonedemo.demo.test;
import com.alicom.mns.tools.DefaultAlicomMessagePuller;
import com.alicom.mns.tools.MessageListener;
import com.aliyuncs.exceptions.ClientException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.ParseException;
import java.util.Collection;
import java.util.Iterator;
import java.util.Queue;
/**
* 消息回执监听启动类
*/
public class AliMessagePuller {
private static Logger logger = LoggerFactory.getLogger(AliMessagePuller.class);
public AliMessagePuller(){}
/**
* 开启消息回执监听
* @param listener 处理队列的监听器
* @param messageType 消息类型
* @param queueName 队列名称
*/
public AliMessagePuller(MessageListener listener,String accessKeyId,String accessKeySecret, String messageType,String queueName) {
DefaultAlicomMessagePuller puller = new DefaultAlicomMessagePuller();
try {
puller.startReceiveMsg(accessKeyId, accessKeySecret, messageType, queueName, listener);
} catch (ClientException e) {
logger.error("开启监听失败,主机连接异常");
e.printStackTrace();
} catch (ParseException e) {
logger.error("开启监听失败,消息解析异常");
e.printStackTrace();
}
}
public static void main(String[] args) throws com.aliyuncs.exceptions.ClientException, ParseException {
DefaultAlicomMessagePuller puller=new DefaultAlicomMessagePuller();
String accessKeyId=秘钥id";
String accessKeySecret=加密秘钥;
String messageType="VoiceReport"; //注意替换成你自己需要获取的消息的类型
String queueName= 获取消息的队列通道 ;//在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName
AliCallVoiceReportListener aliCallVoiceReportListener = new AliCallVoiceReportListener();
puller.startReceiveMsg(accessKeyId,accessKeySecret ,messageType,queueName, aliCallVoiceReportListener);
//设置访问超时时间
// System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
// System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// //云通信产品-语音API服务产品名称(产品名固定,无需修改)
// final String product = "Dyvmsapi";
// //产品域名(接口地址固定,无需修改)
// final String domain = "dyvmsapi.aliyuncs.com";
// //AK信息
// final String accessKeyId = "";
// final String accessKeySecret = "";
// //初始化acsClient 暂时不支持多region
// IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
// DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
// IAcsClient acsClient = new DefaultAcsClient(profile);
// SingleCallByTtsRequest request = new SingleCallByTtsRequest();
// //必填-被叫显号,可在语音控制台中找到所购买的显号
// request.setCalledShowNumber("");
// //必填-被叫号码
// request.setCalledNumber("15625884897");
// //必填-Tts模板ID
// request.setTtsCode("TTS_192730173");
// //可选-当模板中存在变量时需要设置此值
// Map<String,String> tipMessage=new HashMap();
// tipMessage.put("number","1");
// tipMessage.put("time","1");
// tipMessage.put("alarm","1");
// request.setTtsParam(JSON.toJSONString(tipMessage));
//
// //可选-音量 取值范围 0--200
// request.setVolume(100);
// //可选-播放次数
// request.setPlayTimes(2);
// //可选-外部扩展字段,此ID将在回执消息中带回给调用方
// request.setOutId("yourOutId");
// //hint 此处可能会抛出异常,注意catch
// SingleCallByTtsResponse singleCallByTtsResponse = acsClient.getAcsResponse(request);
// String code = singleCallByTtsResponse.getCode();
// String code1 = singleCallByTtsResponse.getCode();
// String message=singleCallByTtsResponse.getMessage();
// String requestId = singleCallByTtsResponse.getRequestId();
// String callId = singleCallByTtsResponse.getCallId();
// logger.error("code="+code+";code1="+code1+";message="+message+";requestId="+requestId+";callId="+callId);
}
}
获取消息队列
package phonedemo.demo.test;
import com.alibaba.fastjson.JSON;
import com.alicom.mns.tools.MessageListener;
import com.aliyun.mns.model.Message;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dyvmsapi.model.v20170525.SingleCallByTtsRequest;
import com.aliyuncs.dyvmsapi.model.v20170525.SingleCallByTtsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.google.gson.Gson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
/**
*监听阿里消息队列 处理语音消息回执(消息回执类型VoiceReport)
*/
public class AliCallVoiceReportListener implements MessageListener {
private static Logger logger = LoggerFactory.getLogger(AliCallVoiceReportListener.class);
/**
*
* @param message
* @return true SDK将调用MNS的delete方法将消息从队列中删除掉
* @return false 消息不会被delete掉,而会根据策略进行重推
*/
@Override
public boolean dealMessage(Message message) {
//消息的几个关键值
logger.info("消息接收时间[{}],message handle[{}],body[{}],id[{}],dequeue count[{}]", null,message.getReceiptHandle(),
message.getMessageBodyAsString(),message.getMessageId(),message.getDequeueCount());
Gson gson = new Gson();
Map<String, Object> contentMap ;
try {
contentMap = gson.fromJson(message.getMessageBodyAsString(), HashMap.class);
} catch (com.google.gson.JsonSyntaxException e) {
logger.error("消息格式错误:[{}]",message.getMessageBodyAsString());
return true;
}
logger.info("返回消息"+contentMap);
//依据自己的消息类型,获取对应的字段
String callId=(String)contentMap.get("call_id");
String startTime=(String)contentMap.get("start_time");
String endTime=(String)contentMap.get("end_time");
String duration=(String)contentMap.get("duration");
String statusCode=(String)contentMap.get("status_code");
String statusMsg=(String)contentMap.get("status_msg");
String outId=(String)contentMap.get("out_id");
String dtmf=(String)contentMap.get("dtmf");
return true;
}
public static void main(String[] args) throws ClientException {
//设置访问超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//云通信产品-语音API服务产品名称(产品名固定,无需修改)
final String product = "Dyvmsapi";
//产品域名(接口地址固定,无需修改)
final String domain = "dyvmsapi.aliyuncs.com";
//AK信息
final String accessKeyId = "";
final String accessKeySecret = "";
//初始化acsClient 暂时不支持多region
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
SingleCallByTtsRequest request = new SingleCallByTtsRequest();
//必填-被叫显号,可在语音控制台中找到所购买的显号
request.setCalledShowNumber("");
//必填-被叫号码
request.setCalledNumber("15625884897");
//必填-Tts模板ID
request.setTtsCode("TTS_192730173");
//可选-当模板中存在变量时需要设置此值
Map<String,String> tipMessage=new HashMap();
tipMessage.put("number","1");
tipMessage.put("time","1");
tipMessage.put("alarm","1");
request.setTtsParam(JSON.toJSONString(tipMessage));
//可选-音量 取值范围 0--200
request.setVolume(100);
//可选-播放次数
request.setPlayTimes(2);
//可选-外部扩展字段,此ID将在回执消息中带回给调用方
request.setOutId("yourOutId");
//hint 此处可能会抛出异常,注意catch
SingleCallByTtsResponse singleCallByTtsResponse = acsClient.getAcsResponse(request);
String code = singleCallByTtsResponse.getCode();
String code1 = singleCallByTtsResponse.getCode();
String message=singleCallByTtsResponse.getMessage();
String requestId = singleCallByTtsResponse.getRequestId();
String callId = singleCallByTtsResponse.getCallId();
logger.error("code="+code+";code1="+code1+";message="+message+";requestId="+requestId+";callId="+callId);
}
}
依赖包:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dyvmsapi</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.6</version>
</dependency>