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

本文介绍了阿里云MNS消息队列在使用过程中遇到的常见问题及其解决方案,包括时间同步要求以避免超时错误,访问权限错误的排查,以及如何设置消息延时发送。错误码包括TimeExpired和AccessDenied,强调了正确配置AccessKey ID、Secret和Endpoint的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阿里云常见用法及错误:

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




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值