SpringCloud 目标绑定
如前所述,目标绑定提供了外部消息传递系统与应用程序提供的生产者和消费者之间的桥梁。
将@EnableBinding批注应用于应用程序的配置类之一可定义目标绑定。@EnableBinding
注释本身使用@Configuration
进行元注释,并触发Spring Cloud Stream基础结构的配置。
下面的示例显示了一个功能完整且运行正常的Spring Cloud Stream应用程序,该应用程序从INPUT
目标接收的消息净荷为String
类型(请参见,内容类型协商部分),并将其记录到控制台,并将其转换为大写字母后将其发送到OUTPUT
目标。
@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
批注可以将一个或多个接口类作为参数。这些参数称为绑定,它们包含表示可绑定组件的方法。这些组件通常是基于通道的活页夹(例如Rabbit,Kafka等)的消息通道(请参见Spring消息传递)。但是,其他类型的绑定可以为相应技术的本机功能提供支持。例如,Kafka Streams绑定器(以前称为KStream)允许直接绑定到Kafka Streams(有关更多详细信息,请参见Kafka Streams)。
Spring Cloud Stream已经为典型的消息交换合同提供了绑定接口,其中包括:
- 接收器:通过提供消费消息的目的地来标识消息消费者的合同。
- 源:通过提供将生成的消息发送到的目的地,来标识消息生产者的合同。
- 处理器:通过公开两个允许使用和产生消息的目的地,封装了接收器和源协定。
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 {}
尽管前面的示例满足了大多数情况,但是您也可以通过定义自己的绑定接口并使用@Input
和@Output
批注来标识实际的可绑定组件,从而定义自己的合同。
例如:
public interface Barista { @Input SubscribableChannel orders(); @Output MessageChannel hotDrinks(); @Output MessageChannel coldDrinks(); }
将上一个示例中显示的接口用作@EnableBinding
的参数将分别触发三个绑定通道的创建,分别命名为orders
,hotDrinks
和coldDrinks
。
您可以根据需要提供任意数量的绑定接口,作为@EnableBinding
批注的参数,如以下示例所示:
@EnableBinding(value = { Orders.class, Payment.class })
在Spring Cloud Stream中,可绑定的MessageChannel
组件是Spring消息传递MessageChannel
(用于出站)及其扩展名SubscribableChannel
(用于入站)。
可轮询的目标绑定
尽管前面描述的绑定支持基于事件的消息使用,但是有时您需要更多控制,例如使用率。
从2.0版开始,您现在可以绑定可轮询的使用者:
以下示例显示了如何绑定可轮询的使用者:
public interface PolledBarista { @Input PollableMessageSource orders(); . . . }
在这种情况下,PollableMessageSource
的实现绑定到orders
“通道”。有关更多详细信息,请参见第29.3.5节“使用轮询的使用者”。
自定义频道名称
通过使用@Input
和@Output
批注,可以为该通道指定自定义的通道名称,如以下示例所示:
public interface Barista { @Input("inboundOrders") SubscribableChannel orders(); }
在前面的示例中,创建的绑定通道被命名为inboundOrders
。
通常,您不需要直接访问各个通道或绑定(除非通过@EnableBinding
注释对其进行配置)。但是,您有时可能会遇到诸如测试或其他极端情况的情况。
除了为每个绑定生成通道并将其注册为Spring beans外,对于每个绑定接口,Spring Cloud Stream还会生成一个实现该接口的bean。这意味着您可以通过在应用程序中自动接线来访问表示绑定或各个通道的接口,如以下两个示例所示:
自动接线绑定界面
@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()); }
对于自定义通道名称或在需要特别命名通道的多通道方案中,您也可以使用标准Spring的@Qualifier
批注。
下面的示例演示如何以这种方式使用@Qualifier批注:
@Autowire @Qualifier("myChannel") private MessageChannel output;
更多建议: