如何为 Wildfly Infinispan 子系统配置自定义 Protostream 序列化上下文初始值设定项?

How to configure a custom Protostream serialization context initializer for Wildfly Infinispan subsystem?

我有一个带有 Infinispan 缓存的 Wildfly 应用程序,其中包含需要自定义序列化的对象。

Marshalling and Encoding Data 的 Infinispan 文档建议使用基于 protobuf 的 Protostream 编组器。

我已经为相应的 documentation section.

中描述的自定义对象生成了 Protostream 编组器和 序列化上下文初始值设定项

我还配置了缓存容器以通过 Wildfly 使用“PROTOSTREAM”编组器 Infinispan subsystem configuration attribute:

<cache-container marshaller="PROTOSTREAM" ... ><!-- ... --></cache-container>

如何配置 Wildfly Infinispan 子系统以使用我的自定义 序列化上下文初始值设定项

根据 Registering serialization context initializers 上的 Infispan 文档部分,有两种机制:

  1. 通过java.util.ServiceLoader
  2. 自动检测
  3. 通过serialization/context-initializer
  4. 手动注册

文档警告说

If you manually register one SerializationContextInitializer implementation, it disables automatic registration. You must then manually register all other implementations.

现在,Wildfly 本身已经注册了自己的各种序列化上下文初始值设定项。 因此,自动检测被禁用。

有没有办法通过 Wildfly Infinispan 子系统配置以声明方式配置自定义序列化上下文初始值设定项?

(请注意,自定义 序列化上下文初始化程序 实现由注释处理器生成到 “target/” 文件夹中。 因此,我想避免 programmatic 注册,因为这将涉及按名称加载 class 或创建一个单独的项目以引用该实现 class。)

Now, Wildfly itself already registers various serialization context initializers of its own. Consequently, automatic detection is disabled.

WildFly 将自动加载从与您的 cache-container 关联的模块可见的任何 SerializationContextInitializer 个实例(通过 ServiceLoader)。这意味着您需要将 key/value 类型与 /META-INF/services/org.infinispan.protstream.SerializationContextInitializer 中枚举的关联 SerializationContextInitializer 实例一起打包为 WildFly 模块,并将该模块与您的 cache-container 相关联。 例如

<cache-container name="foo" marshaller="PROTOSTREAM" modules="org.wildfly.clustering.infinispan.spi com.acme.bar">
   <!--...-->
</cache-container>

这将使用 WF 的默认 SerializationContextInitializer 实例集和打包在“com.acme.bar”模块中的自定义编组器,通过 ProtoStream 编组配置“foo”cache-container。

查看 WF 文档中有关创建自定义模块的详细信息。

我意识到创建自定义模块的需要很尴尬。我希望在未来的版本中简化配置部署特定 cache-container 的过程。