posts - 22, comments - 32, trackbacks - 0, articles - 73
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
          ringboot3+springcloudstream4.x配置集成

          springcloudstream3.X 后逐漸淘汰了 @input @output @EnableBinding 這些注解 到4.X后這個注解都沒有了,全部轉向function 方式(關于function可以了解下)

          組件版本:springboot 3、 springcloud 2022.0.0、springcloudstream4.0.0

          maven依賴:
          <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
          </dependency>
          application.properties:
          # 應用服務 WEB 訪問端口
          server.port=8080
          #配置stream的binder,這里可以更換其它的消息中間件連接配置信息(ciicbinder 名稱)
          spring.cloud.stream.binders.ciicbinder.type=rabbit
          spring.cloud.stream.binders.ciicbinder.environment.spring.rabbitmq.host=10.82.26.126
          spring.cloud.stream.binders.ciicbinder.environment.spring.rabbitmq.port=8094
          spring.cloud.stream.binders.ciicbinder.environment.spring.rabbitmq.username=admin
          spring.cloud.stream.binders.ciicbinder.environment.spring.rabbitmq.password=admin
          spring.cloud.stream.binders.ciicbinder.environment.spring.rabbitmq.virtual-host=/
          #配置使用默認的binder的配置連接信息,如果配置多個binders,可以設置默認的值,也可以在生產者和消息者binding 中設置
          spring.cloud.stream.default-binder=ciicbinder

          spring.cloud.function.definition=mybinder1;mybinder
          spring.cloud.stream.bindings.mybinder.producer.requiredGroups=test_topic
          #如果應用中只有一個消息中間件需要配置,設置一個默認完事,項目中如果有兩種(Rabbit,kafka)可以指定用那個
          #spring.cloud.stream.bindings.mybinder.binder=ciicbinder
          spring.cloud.stream.bindings.mybinder1-out-0.destination=zzz_test
          spring.cloud.stream.bindings.mybinder1-out-0.content-type=application/json


          #下邊是Consumer配置
          #mybinder是自定義名稱-in-0 是固定寫法 zzz_test 這個是通道名稱(如果是Rabbit是對應的exchange)
          spring.cloud.stream.bindings.mybinder-in-0.destination=zzz_test
          spring.cloud.stream.bindings.mybinder-in-0.content-type=application/json
          #消息者組(如果Rabbit對應topic會zzz_test.test1_topic創建topic)
          spring.cloud.stream.bindings.mybinder-in-0.group=test1_topic
          #消息者應用啟動后自動監聽消息(默認值:true)
          spring.cloud.stream.bindings.mybinder-in-0.consumer.auto-startup=true
          #以下是關于Rabbit私有特色設置
          #設置死信隊列(默認值true)
          spring.cloud.stream.rabbit.bindings.mybinder.consumer.auto-bind-dlq=true
          #手動ACK提交消息
          spring.cloud.stream.rabbit.bindings.mybinder.consumer.acknowledge-mode=MANUAL


          解釋下其中 mybinder1 是自定義名稱,如果希望手動向生產者mybinder1 不要使用自定義成 mybinder1-out-0 形式(這是fuction形式),fuction 大多場景是流式方式,企業線應用使用的不多。

          生產者和消息者配置:
          package com.example.demo.demos.web;

          import org.springframework.context.annotation.Bean;
          import org.springframework.context.annotation.Configuration;
          import org.springframework.messaging.Message;
          import org.springframework.messaging.support.MessageBuilder;
          import org.springframework.stereotype.Component;

          import java.util.function.Consumer;
          import java.util.function.Supplier;


          @Component
          @Configuration
          public class ConmerMQ {
          // 如果手動發送消息,要把代碼注釋掉,這是fuction形式自動發消息 mybinder1 名稱要和funtion名稱一致。
          /* @Bean
          public Supplier<Message<String>> mybinder1(){
          return ()->{
          try {
          Thread.sleep(2000);
          } catch (InterruptedException e) {
          e.printStackTrace();
          }
          int s=0;
          System.out.println("生產者 產生消息-data="+"dfafdafd"+(s++));
          return MessageBuilder.withPayload("message product -mybinder1="+"dfafdafd").build();
          };
          }*/

          @Bean
          public Consumer<Message<String>> mybinder() {
          return data -> {
          String ss = data.getPayload();
          System.out.println("================consumer message=" + ss);
          };
          }
          }
          測試代碼:

           @Autowired
          private StreamBridge streamBridge;

          // http://127.0.0.1:8080/hello?name=lisi
          @RequestMapping("/hello")
          @ResponseBody
          public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {
          JSONObject jsonObject=new JSONObject();
          jsonObject.put("name",name);
          //bindingName:如果是propertis中一到致
          //spring.cloud.stream.bindings.mybinder1-out-0.destination=zzz_test 如果是fuction形式要配置mybinder1-out-0
          //spring.cloud.stream.bindings.mybinder1.destination=zzz_test 如果不是fuction形式要配置 mybinder1
          boolean flag=streamBridge.send("mybinder1-out-0",jsonObject.toJSONString());
          return "flag=" + flag;
          }
          備注組件升級后都基本JDK17 工程是多model的話 開發工具比如idea2019 版本最高支持JDK13 可以統一編譯水平到17,然后把POM編譯設置到17,maven插件版升級到支持17 


          在把工程各model language level 設置成 project default(如果idea 版低的話下拉框中選擇不到17)

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 苏尼特右旗| 丁青县| 黑山县| 临洮县| 陇西县| 灵川县| 霍州市| 姜堰市| 岳阳市| 福贡县| 栾城县| 阜平县| 准格尔旗| 安国市| 体育| 景谷| 措勤县| 东兰县| 浏阳市| 常山县| 高尔夫| 嘉黎县| 舞钢市| 东宁县| 石屏县| 渑池县| 阿拉善右旗| 南汇区| 定日县| 崇仁县| 刚察县| 富顺县| 巴楚县| 南汇区| 邵阳县| 剑川县| 尼木县| 富平县| 屏山县| 洛隆县| 隆昌县|