|
@@ -0,0 +1,215 @@
|
|
|
+package org.example.producer;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.rocketmq.client.producer.SendCallback;
|
|
|
+import org.apache.rocketmq.client.producer.SendResult;
|
|
|
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
|
|
+import org.example.producer.dto.HeroDTO;
|
|
|
+import org.springframework.messaging.Message;
|
|
|
+import org.springframework.messaging.support.MessageBuilder;
|
|
|
+import org.springframework.web.bind.annotation.GetMapping;
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.ZoneId;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+@RestController
|
|
|
+@Slf4j
|
|
|
+public class ProducerController {
|
|
|
+
|
|
|
+ @Resource(name = "extRocketMQTemplate")
|
|
|
+ private RocketMQTemplate extRocketMQTemplate;
|
|
|
+
|
|
|
+ /**
|
|
|
+ *发送单向消息
|
|
|
+ */
|
|
|
+ @GetMapping("/send1")
|
|
|
+ public void sendOneWay(){
|
|
|
+ HeroDTO heroDTO = new HeroDTO();
|
|
|
+ heroDTO.setId("jialuo");
|
|
|
+ heroDTO.setName("伽罗");
|
|
|
+ // 设置消息KEYS,一般是数据的唯一ID,主要用于在仪表盘中方便搜索
|
|
|
+ Message<String> msgs = MessageBuilder.withPayload(JSON.toJSONString(heroDTO)).setHeader("KEYS", heroDTO.getId()).build();
|
|
|
+ // 给消息打上射手的标签。主题+tag,中间用“:”分隔,主要是用于消息的过滤,比如说在消费的时候,只消费ESS标签下的消息
|
|
|
+ extRocketMQTemplate.sendOneWay("kingsTopic".concat(":shooter"), msgs);
|
|
|
+
|
|
|
+ //log.info(transactionSendResult.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ *同步发送消息
|
|
|
+ * syncSend方法会阻塞当前线程,直到消息发送完成并收到了消息服务器的响应。如果消息发送成功,
|
|
|
+ * syncSend方法会返回一个SendResult对象,包含了消息的发送状态、消息ID等信息。如果消息发送失败,
|
|
|
+ * syncSend方法会抛出一个MessagingException异常。
|
|
|
+ */
|
|
|
+ @GetMapping("/send2")
|
|
|
+ public void syncSend(){
|
|
|
+ HeroDTO heroDTO = new HeroDTO();
|
|
|
+ heroDTO.setId("luban");
|
|
|
+ heroDTO.setName("小鲁班");
|
|
|
+
|
|
|
+ Message<String> msgs = MessageBuilder.withPayload(JSON.toJSONString(heroDTO)).setHeader("KEYS", heroDTO.getId()).build();
|
|
|
+
|
|
|
+ log.info("同步发送消息:");
|
|
|
+ SendResult sendResult = extRocketMQTemplate.syncSend("kingsTopic".concat(":shooter"), msgs);
|
|
|
+
|
|
|
+ log.info(sendResult.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *异步发送消息
|
|
|
+ * asyncSend方法不会阻塞当前线程,而是在另一个线程中异步发送消息。因此,
|
|
|
+ * asyncSend方法会立即返回,不会等待消息发送完成。如果需要等待消息发送完成并处理发送结果,
|
|
|
+ * 可以使用SendCallback回调接口。
|
|
|
+ */
|
|
|
+ @GetMapping("/send3")
|
|
|
+ public void asyncSend(){
|
|
|
+ HeroDTO heroDTO = new HeroDTO();
|
|
|
+ heroDTO.setId("luban");
|
|
|
+ heroDTO.setName("小鲁班");
|
|
|
+
|
|
|
+ Message<String> msgs = MessageBuilder.withPayload(JSON.toJSONString(heroDTO)).setHeader("KEYS", heroDTO.getId()).build();
|
|
|
+
|
|
|
+ log.info("异步发送消息:");
|
|
|
+ extRocketMQTemplate.asyncSend("kingsTopic".concat(":shooter"), msgs, new SendCallback() {
|
|
|
+ @Override
|
|
|
+ public void onSuccess(SendResult sendResult) {
|
|
|
+ log.info(sendResult.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onException(Throwable e) {
|
|
|
+ log.info(e.getMessage());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *发送单向顺序消息
|
|
|
+ */
|
|
|
+ @GetMapping("/send4")
|
|
|
+ public void sendOneWayOrderly(){
|
|
|
+ HeroDTO heroDTO = new HeroDTO();
|
|
|
+ heroDTO.setId("zhangfei");
|
|
|
+ heroDTO.setName("张飞");
|
|
|
+
|
|
|
+ Message<String> msgs = MessageBuilder.withPayload(JSON.toJSONString(heroDTO)).setHeader("KEYS", heroDTO.getId()).build();
|
|
|
+
|
|
|
+ log.info("发送单向顺序消息:");
|
|
|
+ extRocketMQTemplate.sendOneWayOrderly("kingsTopic".concat(":tank"), msgs,heroDTO.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *同步发送顺序消息
|
|
|
+ */
|
|
|
+ @GetMapping("/send5")
|
|
|
+ public void syncSendOrderly(){
|
|
|
+ HeroDTO heroDTO = new HeroDTO();
|
|
|
+ heroDTO.setId("niumo");
|
|
|
+ heroDTO.setName("牛魔");
|
|
|
+
|
|
|
+ Message<String> msgs = MessageBuilder.withPayload(JSON.toJSONString(heroDTO)).setHeader("KEYS", heroDTO.getId()).build();
|
|
|
+
|
|
|
+ log.info("同步发送顺序消息:");
|
|
|
+ SendResult sendResult = extRocketMQTemplate.syncSendOrderly("kingsTopic".concat(":tank"), msgs, heroDTO.getId());
|
|
|
+ log.info(sendResult.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *异步发送顺序消息
|
|
|
+ */
|
|
|
+ @GetMapping("/send6")
|
|
|
+ public void asyncSendOrderly(){
|
|
|
+ HeroDTO heroDTO = new HeroDTO();
|
|
|
+ heroDTO.setId("xiangyu");
|
|
|
+ heroDTO.setName("项羽");
|
|
|
+
|
|
|
+ Message<String> msgs = MessageBuilder.withPayload(JSON.toJSONString(heroDTO)).setHeader("KEYS", heroDTO.getId()).build();
|
|
|
+
|
|
|
+ log.info("异步发送顺序消息:");
|
|
|
+ extRocketMQTemplate.asyncSendOrderly("kingsTopic".concat(":tank"), msgs, heroDTO.getId(), new SendCallback() {
|
|
|
+ @Override
|
|
|
+ public void onSuccess(SendResult sendResult) {
|
|
|
+ log.info(sendResult.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onException(Throwable e) {
|
|
|
+ log.info(e.getMessage());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *发送延迟消息-任务超时处理
|
|
|
+ */
|
|
|
+ @GetMapping("/send7")
|
|
|
+ public void syncSendDelayTimeSeconds(){
|
|
|
+ HeroDTO heroDTO = new HeroDTO();
|
|
|
+ heroDTO.setId("baiqi");
|
|
|
+ heroDTO.setName("白起");
|
|
|
+
|
|
|
+ Message<String> msgs = MessageBuilder.withPayload(JSON.toJSONString(heroDTO)).setHeader("KEYS", heroDTO.getId()).build();
|
|
|
+
|
|
|
+ log.info("发送延迟消息-任务超时处理:");
|
|
|
+ //10秒后才能消费这条消息
|
|
|
+ SendResult sendResult = extRocketMQTemplate.syncSendDelayTimeSeconds("kingsTopic".concat(":tank"), msgs, 10L);
|
|
|
+ //10毫秒后才能消费这条消息
|
|
|
+ //extRocketMQTemplate.syncSendDelayTimeMills("kingsTopic".concat(":tank"), msgs, 10L);
|
|
|
+ log.info(sendResult.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *发送延迟消息-定时处理
|
|
|
+ */
|
|
|
+ @GetMapping("/send8")
|
|
|
+ public void syncSendDeliverTimeMills(){
|
|
|
+ HeroDTO heroDTO = new HeroDTO();
|
|
|
+ heroDTO.setId("liubang");
|
|
|
+ heroDTO.setName("刘邦");
|
|
|
+
|
|
|
+ Message<String> msgs = MessageBuilder.withPayload(JSON.toJSONString(heroDTO)).setHeader("KEYS", heroDTO.getId()).build();
|
|
|
+
|
|
|
+ //每天凌晨处理
|
|
|
+ long time = LocalDate.now().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
|
|
|
+ log.info("发送延迟消息-定时处理:每天凌晨处理");
|
|
|
+ SendResult sendResult = extRocketMQTemplate.syncSendDeliverTimeMills("kingsTopic".concat(":tank"), msgs, time);
|
|
|
+
|
|
|
+ log.info(sendResult.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *批量发送
|
|
|
+ */
|
|
|
+ @GetMapping("/send9")
|
|
|
+ public void syncSendBatchMessage() throws InterruptedException {
|
|
|
+ List<HeroDTO> heroList = new ArrayList<>();
|
|
|
+ HeroDTO heroDTO = new HeroDTO();
|
|
|
+ heroDTO.setId("geya");
|
|
|
+ heroDTO.setName("戈娅");
|
|
|
+ heroList.add(heroDTO);
|
|
|
+
|
|
|
+ HeroDTO heroDTO1 = new HeroDTO();
|
|
|
+ heroDTO.setId("direnjie");
|
|
|
+ heroDTO.setName("狄仁杰");
|
|
|
+ heroList.add(heroDTO1);
|
|
|
+
|
|
|
+ List<Message> msgs = new ArrayList<Message>();
|
|
|
+ for (HeroDTO hero : heroList){
|
|
|
+ Message<String> message = MessageBuilder.withPayload(JSON.toJSONString(heroDTO))
|
|
|
+ .setHeader("KEYS", heroDTO.getId())
|
|
|
+ .build();
|
|
|
+ msgs.add(message);
|
|
|
+ }
|
|
|
+ log.info("批量发送:");
|
|
|
+ SendResult sendResult = extRocketMQTemplate.syncSend("kingsTopic".concat(":shooter"), msgs);
|
|
|
+ log.info(sendResult.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|