当前位置:文档之家› 淘宝消息服务使用介绍

淘宝消息服务使用介绍

消息服务使用介绍更新时间:2016/03/24 访问次数:229642∙From淘宝消息服务使用∙To淘宝消息服务使用∙常用消息类型说明∙沙箱消息服务开通∙消息服务常见问题消息服务是开放平台为提高应用API调用效率而推出的一种主动推送服务(From淘宝),推送内容包括(淘宝交易、商品、退款等信息),基于该推送服务,应用获取淘宝数据不需再不停轮询API,仅需在接收到淘宝推送的消息时调用API获取即可,大大提高API调用效率和降低API使用费用。

同时还提供消息回流服务(To淘宝),应用可将信息回流到淘宝,做商品数源服务等。

From淘宝:即淘宝向外推送淘宝(包括天猫)的交易、商品、退款等官方消息。

To淘宝:即向淘宝回流消息。

那么如何使用消息服务呢?请看以下是消息服务From淘宝和To淘宝两种方式的详细使用说明。

From淘宝消息服务使用应用订阅消息进入ISV控制台,在“应用管理->消息服务->订阅消息”页面,选择需要的消息进行订阅,点击相应消息后面的“订阅”即可订阅消息成功,可以在“我的订阅”中查看已经成功订阅的消息。

如果需要取消消息的订阅,直接点击“取消订阅”。

点击消息名称可以查看每个消息返回的详细字段信息。

注意:如果该消息没有权限,则说明应用未开通相关API调用权限,通过点击“申请权限”,进入申请相应的权限包。

另如果需要在沙箱开通消息服务使用,可参照本文的[沙箱消息服务开通]章节给用户开通消息调用er.permit接口给用户(即淘宝或天猫商家)开通,可以选择只给用户开通部分消息类型,也可全部开通。

具体可看该API 入参说明。

备注:∙给用户开通消息前提是用户已经给应用授权,如未授权,请参考获取用户授权说明。

∙取消用户的消息服务调用er.cancel接口。

∙可以通过接口er.get获取用户已开通消息,入参必须输入is_valid,topics,modified来判断用户授权消息是否成功∙消息服务API文档:点击这里查看代码实现接收消息正式环境服务地址:ws:///沙箱环境服务地址:ws:///接收消息,实现方式有两种:通过SDK接收消息、通过API接收消息,推荐采用SDK接收消息。

通过SDK接收消息目前支持JAVA与.NET语言,其它语言建议采用API接收消息。

通过SDK接收消息只需要关注业务的处理,不需要操心消息重发、确认、长连接的重连等操作,SDK会自动处理好一切。

JAVA接口使用说明12 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 publicinterface MessageHandler {/*** 消息通道客户端收到消息后,会回调该方法处理具体的业务,处理结果可以通过以下两种方式来表述:* <ul>* <li>抛出异常或设置status.fail()表明消息处理失败,需要消息通道服务端重发* <li>不抛出异常,也没有设置status信息,则表明消息处理成功,消息通道服务端不会再投递此消息** @param message 消息内容* @param status 处理结果,如果调用status.fail(),消息通道将会择机重发消息;否则,消息通道认为消息处理成功* @throws Exception 消息处理失败,消息通道将会择机重发消息*/publicvoid onMessage(Message message, MessageStatus status) throws E xception;}JAVA使用代码示例12 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 TmcClient client = new TmcClient("app_key", "app_secret", "default"); // 关于default参考消息分组说明client.setMessageHandler(new MessageHandler() {publicvoid onMessage(Message message, MessageStatus status) {try{System.out.println(message.getContent());System.out.println(message.getTopic());} catch(Exception e) {e.printStackTrace();status.fail(); // 消息处理失败回滚,服务端需要重发}}});client.connect("ws://"); // 消息环境地址:ws://mc.api.tbsand/注:采用Java main方法在Eclipse里面运行上面的代码测试时,请在client.connect()后面加上Thread.sleep让main线程等待一段时间结束,以便观察消息的实时接收情况,否则main线程结束后,TMC长连接也会跟着断开。

如果是在web服务器上运行上面的代码,则不用在client.connect()后面加任何Thread.sleep代码,也不需要在外面包一层while(true)循环,因为web服务器上的主线程只要服务器不关闭都是不会结束的,TMC的长连接会一直保持。

C#使用示例代码12 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1TmcClient client = new TmcClient("appkey", "appsecret", "default"); // 关于default参考消息分组说明client.OnMessage += (s, e) =>{try{Console.WriteLine(e.Message.Topic);5Console.WriteLine(e.Message.Content);16// 默认不抛出异常则认为消息处理成功}catch(Exception exp){Console.WriteLine(exp.StackTrace);e.Fail(); // 消息处理失败回滚,服务端需要重发}};client.Connect("ws:///"); // 消息环境地址:ws://mc.api.tbsan/注:采用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示例代码12 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 TaobaoClient client = new DefaultTaobaoClient("/ro uter/rest", "app_key", "app_secret", "json");do{long quantity = 100L;TmcMessagesConsumeResponse rsp = null;do{TmcMessagesConsumeRequest req = new TmcMessagesConsumeRequ est();req.setQuantity(quantity);req.setGroupName("default");rsp = client.execute(req);2 0 2 1 2 2 23 24 25 2 6if(rsp.isSuccess() && rsp.getMessages() != null) {for(TmcMessage msg : rsp.getMessages()) {// handle messageSystem.out.println(msg.getContent());System.out.println(msg.getTopic());// confirm messageTmcMessagesConfirmRequest cReq = new TmcMessagesConfirmR equest();cReq.setGroupName("default");cReq.setsMessageIds(String.valueOf(msg.getId()));TmcMessagesConfirmResponse cRsp = 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#示例代码12 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 ITopClient client = new DefaultTopClient("/router/re st", "app_key", "app_secret", "json");do{long quantity = 100L;TmcMessagesConsumeResponse rsp = null;do{TmcMessagesConsumeRequest req = new TmcMessagesConsumeRequ est();req.GroupName = "default";req.Quantity = quantity;2 1 2 2 23 24 25 26 27 28 29 3 0rsp = client.Execute(req);if(!rsp.IsError && rsp.Messages != null){foreach (TmcMessage msg in Messages){// handle messageConsole.WriteLine(msg.Topic);Console.WriteLine(msg.Content);// confirm messageTmcMessagesConfirmRequest cReq = new TmcMessagesConfirmR equest();cReq.GroupName = "default";cReq.SMessageIds = msg.Id.ToString();TmcMessagesConfirmResponse cRsp = 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(new TimeSpan(0, 0, 1));} while(true);注:通过API拉取消息的平均RT在网络好的情况下能达到10毫秒左右,每次消费得到的消息为空时,务必暂停至少1秒才去执行下一次循环拉取消息,否则会产生很多无谓的请求,白白浪费服务端的资源,以及应用自身的API流量包。

相关主题