如何为 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 文档部分,有两种机制:
- 通过
java.util.ServiceLoader
自动检测
- 通过
serialization/context-initializer
手动注册
文档警告说
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 的过程。
我有一个带有 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 文档部分,有两种机制:
- 通过
java.util.ServiceLoader
自动检测
- 通过
serialization/context-initializer
手动注册
文档警告说
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 的过程。