消息服务使用介绍更新时间:2016/03/24访问次数:229642From淘宝消息服务使用To淘宝消息服务使用常用消息类型说明沙箱消息服务开通消息服务常见问题消息服务是开放平台为提高应用API调用效率而推出的一种主动推送服务(From淘宝),推送内容包括(淘宝交易、商品、退款等信息),基于该推送服务,应用获取淘宝数据不需再不停轮询API,仅需在接收到淘宝推送的消息时调用API获取即可,大大提高API调用效率和降低API使用费用。同时还提供消息回流服务(To淘宝),应用可将信息回流到淘宝,做商品数源服务等。From淘宝:即淘宝向外推送淘宝(包括天猫)的交易、商品、退款等官方消息。To淘宝:即向淘宝回流消息。那么如何使用消息服务呢?请看以下是消息服务From淘宝和To淘宝两种方式的详细使用说明。From淘宝消息服务使用应用订阅消息进入ISV控制台,在“应用管理-消息服务-订阅消息”页面,选择需要的消息进行订阅,点击相应消息后面的“订阅”即可订阅消息成功,可以在“我的订阅”中查看已经成功订阅的消息。如果需要取消消息的订阅,直接点击“取消订阅”。点击消息名称可以查看每个消息返回的详细字段信息。注意:如果该消息没有权限,则说明应用未开通相关API调用权限,通过点击“申请权限”,进入申请相应的权限包。另如果需要在沙箱开通消息服务使用,可参照本文的[沙箱消息服务开通]章节给用户开通消息调用taobao.tmc.user.permit接口给用户(即淘宝或天猫商家)开通,可以选择只给用户开通部分消息类型,也可全部开通。具体可看该API入参说明。备注:给用户开通消息前提是用户已经给应用授权,如未授权,请参考获取用户授权说明。取消用户的消息服务调用taobao.tmc.user.cancel接口。可以通过接口taobao.tmc.user.get获取用户已开通消息,入参必须输入is_valid,topics,modified来判断用户授权消息是否成功消息服务API文档:点击这里查看代码实现接收消息正式环境服务地址:ws://mc.api.taobao.com/沙箱环境服务地址:ws://mc.api.tbsandbox.com/接收消息,实现方式有两种:通过SDK接收消息、通过API接收消息,推荐采用SDK接收消息。通过SDK接收消息目前支持JAVA与.NET语言,其它语言建议采用API接收消息。通过SDK接收消息只需要关注业务的处理,不需要操心消息重发、确认、长连接的重连等操作,SDK会自动处理好一切。JAVA接口使用说明123456789101112131415publicinterfaceMessageHandler{/***消息通道客户端收到消息后,会回调该方法处理具体的业务,处理结果可以通过以下两种方式来表述:*ul*li抛出异常或设置status.fail()表明消息处理失败,需要消息通道服务端重发*li不抛出异常,也没有设置status信息,则表明消息处理成功,消息通道服务端不会再投递此消息**@parammessage消息内容*@paramstatus处理结果,如果调用status.fail(),消息通道将会择机重发消息;否则,消息通道认为消息处理成功*@throwsException消息处理失败,消息通道将会择机重发消息*/publicvoidonMessage(Messagemessage,MessageStatusstatus)throwsException;}JAVA使用代码示例12345678910111213TmcClientclient=newTmcClient(app_key,app_secret,default);//关于default参考消息分组说明client.setMessageHandler(newMessageHandler(){publicvoidonMessage(Messagemessage,MessageStatusstatus){try{System.out.println(message.getContent());System.out.println(message.getTopic());}catch(Exceptione){e.printStackTrace();status.fail();//消息处理失败回滚,服务端需要重发}}});client.connect(ws://mc.api.taobao.com);//消息环境地址:ws://mc.api.tbsandbox.com/注:采用Javamain方法在Eclipse里面运行上面的代码测试时,请在client.connect()后面加上Thread.sleep让main线程等待一段时间结束,以便观察消息的实时接收情况,否则main线程结束后,TMC长连接也会跟着断开。如果是在web服务器上运行上面的代码,则不用在client.connect()后面加任何Thread.sleep代码,也不需要在外面包一层while(true)循环,因为web服务器上的主线程只要服务器不关闭都是不会结束的,TMC的长连接会一直保持。C#使用示例代码12345678910111213141TmcClientclient=newTmcClient(appkey,appsecret,default);//关于default参考消息分组说明client.OnMessage+=(s,e)={try{Console.WriteLine(e.Message.Topic);516Console.WriteLine(e.Message.Content);//默认不抛出异常则认为消息处理成功}catch(Exceptionexp){Console.WriteLine(exp.StackTrace);e.Fail();//消息处理失败回滚,服务端需要重发}};client.Connect(ws://mc.api.taobao.com/);//消息环境地址:ws://mc.api.tbsandbox.com/注:采用C#Main方法在VS控制台工程里面运行上面的代码测试时,请在client.Connect后面加上Console.Read()或Thread.Sleep让main线程暂时不结束,以便观察消息的实时接收情况,否则Main线程结束后,TMC长连接也会跟着断开。如果是在IIS服务器或C#应用程序里面运行上面的代码,则不用在client.Connect后面加任何等待的代码,也不需要在外面包一层while(true)循环,只要保持IIS服务器或C#应用程序不关闭,TMC的长连接会一直保持。通过API接收消息提供API接收消息的目的是那种对多线程和长连接处理不方便的语言使用的,比如PHP、Python,这些语言官方暂时没有提供SDK,可以通过下面两个API配合使用也能达到接收和确认消息的目的。推荐尽量用SDK方式,如果必须使用API,建议调用taobao.tmc.messages.consume接口时尽量不要并发或并发量不要太大,API使用存在实时性不是很高的情况,如果实时性要求高建议还是用SDK。基本步骤:首先消费消息:API名称:taobao.tmc.messages.consume消息消费后,指针自动后移,下次调用自动获取到未消费过的消息,但是消费确认后的消息无法再次获取。然后确认消息:API名称:taobao.tmc.messages.confirm获取消息后,如果不确认,消息服务会选择时机重发,重发次数由消息服务控制,如果消息3天内都没有被确认将会被删除。JAVA示例代码12345678910111213141516171819TaobaoClientclient=newDefaultTaobaoClient();do{longquantity=100L;TmcMessagesConsumeResponsersp=null;do{TmcMessagesConsumeRequestreq=newTmcMessagesConsumeRequest();req.setQuantity(quantity);req.setGroupName(default);rsp=client.execute(req);20212223242526if(rsp.isSuccess()&&rsp.getMessages()!=null){for(TmcMessagemsg:rsp.getMessages()){//handlemessageSystem.out.println(msg.getContent());System.out.println(msg.getTopic());//confirmmessageTmcMessagesConfirmRequestcReq=newTmcMessagesConfirmRequest();cReq.setGroupName(default);cReq.setsMessageIds(String.valueOf(msg.getId()));TmcMessagesConfirmResponsecRsp=client.execute(cReq);System.out.println(cRsp.getBody());}}System.out.println(rsp.getBody());}while(rsp!=null&&rsp.isSuccess()&&rsp.getMessages()!=null&&rsp.getMessages().size()==quantity);Thread.sleep(1000L);}while(true);C#示例代码1234567891011121314151617181920ITopClientclient=newDefaultTopClient();do{longquantity=100L;TmcMessagesConsumeResponsersp=null;do{TmcMessagesConsumeRequestreq=newTmcMessagesConsumeRequest();req.GroupName=default;req.Quantity=quantity;21222324252627282930rsp=client.Execute(req);if(!rsp.IsError&&rsp.Messages!=null){foreach(TmcMessagemsginMessages){//handlemessageConsole.WriteLine(msg.Topic);Console.WriteLine(msg.Content);//confirmmessageTmcMessagesConfirmRequestcReq=newTmcMessagesConfirmRequest();cReq.GroupName=default;cReq.SMessageIds=msg.Id.ToString();TmcMessagesConfirmResponsecRsp=client.Execute(cReq);Console.WriteLine(cRsp.Body);}}Console.WriteLine(rsp.Body);}while(rsp!=null&&!rsp.IsError&&rsp.Messages!=null&&rsp.Messages.Count==quantity);Thread.Sleep(newTimeSpan(0,0,1));}while(true);注:通过API拉取消息的平均RT在网络好的情况下