全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 阿里云办公 培训与认证 物联网
消息队列 MQ

HTTP 顺序消息

更新时间:2017-08-24 17:41:21   分享:   

本文主要描述如何在 Java 环境下使用 HTTP 协议发送顺序消息。HTTP 目前不支持顺序消费。如果需要严格顺序消费,请使用 TCP 客户端。

HTTP 协议规范请参考协议规范文档

HTTP 协议下使用 Java 收发消息以及相关 Demo 请参考Java 收发消息文档

HTTP 发送顺序消息示例代码

请在 com.alibaba.ons.message.example.producer.HttpMQProducer 中添加如下代码。

  1. /**
  2. *
  3. * @param msg 消息内容
  4. * @param tag 消息Tag
  5. * @param key 消息Key
  6. * @param isOrder 是否为顺序消息
  7. * @param shardingKey 顺序消息sharding key
  8. * @return
  9. */
  10. public boolean sendOrderMessage(String msg, String tag, String key,boolean isOrder,String shardingKey){
  11. long time = System.currentTimeMillis();
  12. HttpRequestWithBody req = Unirest.post(url);
  13. String signString = topic + NEWLINE + producerId + NEWLINE
  14. + MD5.getInstance().getMD5String(msg) + NEWLINE + time;
  15. String sign = AuthUtil.calSignature(signString.getBytes(StandardCharsets.UTF_8), secretKey);
  16. req.header("Signature", sign);
  17. req.header("AccessKey", accessKey);
  18. req.header("ProducerID", producerId);
  19. req.queryString("topic", topic);
  20. req.queryString("time", time);
  21. //消息Tag
  22. if(tag!=null){
  23. req.queryString("tag",tag);
  24. }
  25. //消息Key
  26. if(key!=null){
  27. req.queryString("key",key);
  28. }
  29. //发送顺序消息参数
  30. if (isOrder && shardingKey!=null) {
  31. req.header("isOrder", isOrder);
  32. req.header("shardingKey", shardingKey);
  33. }
  34. req.body(msg);
  35. try {
  36. HttpResponse<String> res = req.asString();
  37. if (res.getStatus() == 201) {
  38. System.out.println(res.getBody());
  39. return true;
  40. } else {
  41. log.error(res.getBody());
  42. log.error("post message error: {}", msg, res.getBody());
  43. }
  44. } catch (UnirestException e) {
  45. log.error("post message error: {}", msg, e);
  46. }
  47. return false;
  48. }

注意

  • 顺序消息和定时消息是分开的,不能发送既顺序又定时的消息。
  • 如果是定时消息,则发送的 Topic 必须申明为非顺序,否则定时消息不会生效。

使用说明

  1. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("producer/producer.xml");
  2. HttpMQProducer producer = context.getBean(HttpMQProducer.class);
  3. //发送定时消息: producer.send("msg", "tag", "key", startDeliverTime);
  4. //发送顺序消息: producer.sendOrderMessage("msg", "tag", "key",true,"shardingKey");
  5. if (producer.send("msg", "tag", "key")) {
  6. System.out.println("send message success");
  7. } else {
  8. System.out.println("send message failed");
  9. }
  10. context.close();
本文导读目录
本文导读目录
以上内容是否对您有帮助?