binding
spring cloud stream的核心概念-binding定义
binding 定义
Represents a binding between an input or output and an adapter endpoint that connects via a Binder. The binding could be for a consumer or a producer. A consumer binding represents a connection from an adapter to an input. A producer binding represents a connection from an output to an adapter.
代表一个输入或输出和一个适配器端点之间的绑定,这个绑定是通过Binder连接的。该绑定可以是用于消费者或生产者。消费者绑定表示从适配器到输入的连接。生产者绑定代表从输出到适配器的连接。
接口定义:
// `Binding<T>`: binding的类型
public interface Binding<T> extends Pausable {
default Map<String, Object> getExtendedInfo() {
return Collections.emptyMap();
}
// 组件启动之后实例就已经 start,因此 stop() / start() 方法通常用于 re-bind / re-start。
default void start() {
}
default void stop() {
}
// 当且仅当组件实现了 Pausable 时,pause() / resume() 方法可以用于实现 pause/resume 操作。
default void pause() {
this.stop();
}
default void resume() {
this.start();
}
// isRunning() 方法在当前实例所表示的目标组件在运行时返回true。
default boolean isRunning() {
return false;
}
// getName() 方法返回的是 `destination name`,也就是当前binding的目的地的名字。
default String getName() {
return null;
}
// getBindingName() 返回的是 `binding name`,也就是当前绑定目标的名字,如 channel name
default String getBindingName() {
return null;
}
// 解除这个实例所代表的目标组件的绑定,并停止任何活动组件。实现必须是idempotent的。
// 在这个方法被调用后,目标组件不会收到任何消息;这个实例应该被丢弃,而应该创建一个新的Binding。
void unbind();
// isInput() 方法表明当前 binding 的类型,true 是 input binding,false 是 output binding。
// 由于 @input 和 @output 只能用一个,因此不会同时即是 input 又是 output。
// (TBD:有点怪,如果真要同时支持 input 和 output 该怎么办?创建两个实例?)
default boolean isInput() {
throw new UnsupportedOperationException(
"Binding implementation `" + this.getClass().getName()
+ "` must implement this operation before it is called");
}
}
默认实现
@JsonPropertyOrder({ "bindingName", "name", "group", "pausable", "state" })
@JsonIgnoreProperties("running")
public class DefaultBinding<T> implements Binding<T> {
}
getName() 和 getBindingName() 的差异就很清楚了,getName() 返回的就是构建binding时给出的 name,而 getBindingName() 则要看 target 是不是 IntegrationObjectSupport ,如果是,则取 target 的 getComponentName。
@Override
public String getName() {
return this.name;
}
@Override
public String getBindingName() {
String resolvedName = (this.target instanceof IntegrationObjectSupport)
? ((IntegrationObjectSupport) this.target).getComponentName() : getName();
return resolvedName == null ? getName() : resolvedName;
}