springcloudstream3.X 后逐漸淘汰了 @input @output @EnableBinding 這些注解 到4.X后這個注解都沒有了,全部轉(zhuǎn)向function 方式(關(guān)于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:# 應(yīng)用服務(wù) 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=/
#配置使用默認(rèn)的binder的配置連接信息,如果配置多個binders,可以設(shè)置默認(rèn)的值,也可以在生產(chǎn)者和消息者binding 中設(shè)置
spring.cloud.stream.default-binder=ciicbinder
spring.cloud.function.definition=mybinder1;mybinder
spring.cloud.stream.bindings.mybinder.producer.requiredGroups=test_topic
#如果應(yīng)用中只有一個消息中間件需要配置,設(shè)置一個默認(rèn)完事,項目中如果有兩種(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是對應(yīng)的exchange)
spring.cloud.stream.bindings.mybinder-in-0.destination=zzz_test
spring.cloud.stream.bindings.mybinder-in-0.content-type=application/json
#消息者組(如果Rabbit對應(yīng)topic會zzz_test.test1_topic創(chuàng)建topic)
spring.cloud.stream.bindings.mybinder-in-0.group=test1_topic
#消息者應(yīng)用啟動后自動監(jiān)聽消息(默認(rèn)值:true)
spring.cloud.stream.bindings.mybinder-in-0.consumer.auto-startup=true
#以下是關(guān)于Rabbit私有特色設(shè)置
#設(shè)置死信隊列(默認(rèn)值true)
spring.cloud.stream.rabbit.bindings.mybinder.consumer.auto-bind-dlq=true
#手動ACK提交消息
spring.cloud.stream.rabbit.bindings.mybinder.consumer.acknowledge-mode=MANUAL
解釋下其中 mybinder1 是自定義名稱,如果希望手動向生產(chǎn)者mybinder1 不要使用自定義成 mybinder1-out-0 形式(這是fuction形式),fuction 大多場景是流式方式,企業(yè)線應(yīng)用使用的不多。生產(chǎn)者和消息者配置: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 {
// 如果手動發(fā)送消息,要把代碼注釋掉,這是fuction形式自動發(fā)消息 mybinder1 名稱要和funtion名稱一致。
/* @Bean
public Supplier<Message<String>> mybinder1(){
return ()->{
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int s=0;
System.out.println("生產(chǎn)者 產(chǎn)生消息-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的話 開發(fā)工具比如idea2019 版本最高支持JDK13 可以統(tǒng)一編譯水平到17,然后把POM編譯設(shè)置到17,maven插件版升級到支持17

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