45. Broadcasting Your Own Events

Bus 可以携带RemoteApplicationEvent类型的任何 event,但默认传输是 JSON,反序列化器需要知道在 time 之前将使用哪些类型。要注册一个新类型,它需要在org.springframework.cloud.bus.event的子包中。

要自定义 event name,可以在自定义 class 上使用@JsonTypeName,或者依赖于使用 class 的简单 name 的默认策略。请注意,producer 和 consumer 都需要访问 class 定义。

45.1 在自定义包中注册 events

如果您不能或不想为自定义 events 使用org.springframework.cloud.bus.event的子包,则必须使用@RemoteApplicationEventScan指定要为RemoteApplicationEvent类型的 events 扫描的包。使用@RemoteApplicationEventScan指定的包包含子包。

例如,如果您有一个名为FooEvent的自定义 event:

package com.acme;

public class FooEvent extends RemoteApplicationEvent {
    ...
}

您可以通过以下方式使用反序列化器注册此 event:

package com.acme;

@Configuration
@RemoteApplicationEventScan
public class BusConfiguration {
    ...
}

如果不指定 value,则将注册使用@RemoteApplicationEventScan的 class 包。在这个 example 中,com.acme将使用BusConfiguration包注册。

您还可以使用@RemoteApplicationEventScan上的valuebasePackagesbasePackageClasses properties 显式指定要扫描的包。例如:

package com.acme;

@Configuration
//@RemoteApplicationEventScan({"com.acme", "foo.bar"})
//@RemoteApplicationEventScan(basePackages = {"com.acme", "foo.bar", "fizz.buzz"})
@RemoteApplicationEventScan(basePackageClasses = BusConfiguration.class)
public class BusConfiguration {
    ...
}

上面@RemoteApplicationEventScan的所有示例都是等效的,因为com.acme包将通过在@RemoteApplicationEventScan上显式指定包来注册。注意,您可以指定要扫描的多个基本包。