阿里云常见用法及错误:
1、往阿里云上推消息,和从阿里云上拉取消息都需要本地服务器时间与阿里云上实际时间一致,也就是不能改时间。改时间会报超时的错误。
错误码:TimeExpired 错误描述:The http request you sent is expired. http状态码:408
2、阿里云访问权限错误
错误码:AccessDenied 错误描述:The OwnerId that your Access Key Idassociated to is forbidden for this operation. http状态码:403
出现这类错误的原因是:没有权限,这accessKey所属的阿里云账号禁止进行此操作。
例如:同一个阿里云账号上有广州和深圳两个终点,分别为体验环境和开发环境的队列:
体验环境:(以-test结尾)
MNS_ACCESSKEYID 85743kfsdfjkgdfgh23
MNS_ACCESSKEYSECRET fgfdg4f34545645dkfsdgfg
MNS_ACCOUNTENDPOINT http://19642676786765.mns.cn-guangzhou.aliyuncs.com
AliYunMns.TXFK_DATA_QUEUE_NAME P2P-withdraw-back-record-test
开发环境:(以-dev结尾)
MNS_ACCESSKEYID 125631JHFKSDIfsdj
MNS_ACCESSKEYSECRET KFDJFKggjdgfgjKJDGDkglgflkgs
MNS_ACCOUNTENDPOINT http://19642465670496765.mns.cn-shenzhen.aliyuncs.com
AliYunMns.TXFK_DATA_QUEUE_NAME P2P-withdraw-back-record-dev
如果用体验环境的Id、secret和endpoint去访问开发环境的队列 P2P-withdraw-back-record-dev就会报上面的错误。如下所示:
MNS_ACCESSKEYID 85743kfsdfjkgdfgh23
MNS_ACCESSKEYSECRET fgfdg4f34545645dkfsdgfg
MNS_ACCOUNTENDPOINT http://19642676786765.mns.cn-guangzhou.aliyuncs.comqueues/P2P-withdraw-back-record-dev
因为体验环境限制了队列以-test结尾,所以就必须要以-test去访问。
3、如何实现消息延时发送?
使用阿里云提供的com.aliyun.mns.model.Message类,设置message.delaySeconds属性,该属性定义的是这消息延时多少毫秒,也就说在当前时间之前多少毫秒才能从MNS上拉取到这条消息,在这之前,该消息不可见,也不能被拉取到。
(1)如何往MNS上推送数据?
CloudQueue queue =getSmsPutClient().getCloudQueue(redisCacheBo.getCacheValue("SYSTEM.MNS_MESSAGEQUEUENAME"));
Message message=new Message();
for(MessageDto mDto:list){
String sDto=JSONUtils.obj2json(mDto);
message.setMessageBody(sDto);
MessageRelation messageInfo=messageRelationMapper.selectByPrimaryKey(mDto.getTemplateId());
String durTime=messageInfo.getDurtime();
String[] time=durTime.split("-");
message.setDelaySeconds(dayBreak(time[0],time[1]));
queue.putMessage(message);
}
(2)如何从MNS上拉取数据?
CloudAccount account = new CloudAccount(MNSAccessKeyId,MNSAccessKeySecret,MNSAccountEndpoint);
MNSClient client = account.getMNSClient();
CloudQueue queue = client.getQueueRef(QUEUE_NAME1);
int batchMsgSize = 15;
List<Message> batchPopMessage = queue.batchPopMessage(batchMsgSize);