springcloudstream3.X 后逐漸淘汰了 @input @output @EnableBinding 這些注解 到4.X后這個注解都沒有了,全部轉向function 方式(關于function可以了解下)組件版本:springboot 3、 springcloud 2022.0.0、springcloudstream4.0.0maven依賴:<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)
