SpringCloud 目標(biāo)綁定

2023-11-25 09:14 更新

如前所述,目標(biāo)綁定提供了外部消息傳遞系統(tǒng)與應(yīng)用程序提供的生產(chǎn)者消費者之間的橋梁

將@EnableBinding批注應(yīng)用于應(yīng)用程序的配置類之一可定義目標(biāo)綁定。@EnableBinding注釋本身使用@Configuration進(jìn)行元注釋,并觸發(fā)Spring Cloud Stream基礎(chǔ)結(jié)構(gòu)的配置。

下面的示例顯示了一個功能完整且運行正常的Spring Cloud Stream應(yīng)用程序,該應(yīng)用程序從INPUT目標(biāo)接收的消息凈荷為String類型(請參見,內(nèi)容類型協(xié)商部分),并將其記錄到控制臺,并將其轉(zhuǎn)換為大寫字母后將其發(fā)送到OUTPUT目標(biāo)。

@SpringBootApplication
@EnableBinding(Processor.class)
public class MyApplication {

	public static void main(String[] args) {
		SpringApplication.run(MyApplication.class, args);
	}

	@StreamListener(Processor.INPUT)
	@SendTo(Processor.OUTPUT)
	public String handle(String value) {
		System.out.println("Received: " + value);
		return value.toUpperCase();
	}
}

如您所見,@EnableBinding批注可以將一個或多個接口類作為參數(shù)。這些參數(shù)稱為綁定,它們包含表示可綁定組件的方法。這些組件通常是基于通道的活頁夾(例如Rabbit,Kafka等)的消息通道(請參見Spring消息傳遞)。但是,其他類型的綁定可以為相應(yīng)技術(shù)的本機功能提供支持。例如,Kafka Streams綁定器(以前稱為KStream)允許直接綁定到Kafka Streams(有關(guān)更多詳細(xì)信息,請參見Kafka Streams)。

Spring Cloud Stream已經(jīng)為典型的消息交換合同提供了綁定接口,其中包括:

  • 接收器:通過提供消費消息的目的地來標(biāo)識消息消費者的合同。
  • 源:通過提供將生成的消息發(fā)送到的目的地,來標(biāo)識消息生產(chǎn)者的合同。
  • 處理器:通過公開兩個允許使用和產(chǎn)生消息的目的地,封裝了接收器和源協(xié)定。
public interface Sink {

  String INPUT = "input";

  @Input(Sink.INPUT)
  SubscribableChannel input();
}
public interface Source {

  String OUTPUT = "output";

  @Output(Source.OUTPUT)
  MessageChannel output();
}
public interface Processor extends Source, Sink {}

盡管前面的示例滿足了大多數(shù)情況,但是您也可以通過定義自己的綁定接口并使用@Input@Output批注來標(biāo)識實際的可綁定組件,從而定義自己的合同

例如:

public interface Barista {

    @Input
    SubscribableChannel orders();

    @Output
    MessageChannel hotDrinks();

    @Output
    MessageChannel coldDrinks();
}

將上一個示例中顯示的接口用作@EnableBinding的參數(shù)將分別觸發(fā)三個綁定通道的創(chuàng)建,分別命名為orders,hotDrinkscoldDrinks

您可以根據(jù)需要提供任意數(shù)量的綁定接口,作為@EnableBinding批注的參數(shù),如以下示例所示:

@EnableBinding(value = { Orders.class, Payment.class })

在Spring Cloud Stream中,可綁定的MessageChannel組件是Spring消息傳遞MessageChannel(用于出站)及其擴展名SubscribableChannel(用于入站)。

可輪詢的目標(biāo)綁定

盡管前面描述的綁定支持基于事件的消息使用,但是有時您需要更多控制,例如使用率。

從2.0版開始,您現(xiàn)在可以綁定可輪詢的使用者:

以下示例顯示了如何綁定可輪詢的使用者:

public interface PolledBarista {

    @Input
    PollableMessageSource orders();
	. . .
}

在這種情況下,PollableMessageSource的實現(xiàn)綁定到orders“通道”。有關(guān)更多詳細(xì)信息,請參見第29.3.5節(jié)“使用輪詢的使用者”。

自定義頻道名稱

通過使用@Input@Output批注,可以為該通道指定自定義的通道名稱,如以下示例所示:

public interface Barista {
    @Input("inboundOrders")
    SubscribableChannel orders();
}

在前面的示例中,創(chuàng)建的綁定通道被命名為inboundOrders

通常,您不需要直接訪問各個通道或綁定(除非通過@EnableBinding注釋對其進(jìn)行配置)。但是,您有時可能會遇到諸如測試或其他極端情況的情況。

除了為每個綁定生成通道并將其注冊為Spring beans外,對于每個綁定接口,Spring Cloud Stream還會生成一個實現(xiàn)該接口的bean。這意味著您可以通過在應(yīng)用程序中自動接線來訪問表示綁定或各個通道的接口,如以下兩個示例所示:

自動接線綁定界面

@Autowire
private Source source

public void sayHello(String name) {
    source.output().send(MessageBuilder.withPayload(name).build());
}

自動連線個別頻道

@Autowire
private MessageChannel output;

public void sayHello(String name) {
    output.send(MessageBuilder.withPayload(name).build());
}

對于自定義通道名稱或在需要特別命名通道的多通道方案中,您也可以使用標(biāo)準(zhǔn)Spring的@Qualifier批注。

下面的示例演示如何以這種方式使用@Qualifier批注:

@Autowire
@Qualifier("myChannel")
private MessageChannel output;
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號