【阿里云】MNS消息队列常见问题及解决方法

来源:互联网 发布:js统计按钮点击次数 编辑:程序博客网 时间:2024/04/29 21:06

阿里云常见用法及错误:

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);




0 2