我有一个带有 Infinispan 缓存的 Wildfly 应用程序,其中包含需要自定义序列化的对象。
有关编组和编码数据的 Infinispan 文档建议使用基于 protobuf 的 Protostream 编组器。
我已经为自定义对象生成了 Protostream 编组器和序列化上下文初始值设定项,如相应的文档部分中所述。
我还通过 Wildfly Infinispan 子系统配置属性将缓存容器配置为使用“PROTSTREAM”编组器:
<cache-container marshaller="PROTOSTREAM" ... ><!-- ... --></cache-container>
如何配置 Wildfly Infinispan 子系统以使用我的自定义序列化上下文初始值设定项?
根据 Infispan 文档中关于“注册序列化上下文初始化程序”的部分,有两种机制:
通过java.util.ServiceLoader
自动检测通过
serialization/context-initializer
手动注册
如果您手动注册一个
SerializationContextInitializer
实现,则会禁用自动注册。然后,您必须手动注册所有其他实现。
现在,Wildfly 本身已经注册了自己的各种“序列化上下文初始化程序”。 因此,自动检测被禁用。
有没有办法通过Wildfly Infinispan子系统配置以声明方式
配置自定义序列化上下文初始化器? (请注意,自定义序列化上下文初始化器实现由注释处理器生成到“target/”
文件夹中。 因此,我想避免“程序化”注册,因为这将涉及按名称加载该类或创建一个单独的项目以引用该实现类。)现在,Wildfly 本身已经注册了各种序列化上下文 它自己的初始化器。因此,自动检测是 已禁用。
WildFly 将自动加载与缓存容器关联的模块中可见的任何中枚举的关联ServiceLoader
)。这意味着您需要将您的键/值类型以及
SerializationContextInitializer
/META-INF/services/org.infinispan.protstream.SerializationContextInitializer
实例打包为 WildFly 模块,并将该模块与您的缓存容器相关联。 例如
<cache-container name="foo" marshaller="PROTOSTREAM" modules="org.wildfly.clustering.infinispan.spi com.acme.bar">
<!--...-->
</cache-container>
这将使用 WF 的默认
SerializationContextInitializer
实例集和打包在“com.acme.bar”模块中的自定义编组器,通过 ProtoStream 编组配置“foo”缓存容器。请参阅 WF 文档有关创建自定义模块的详细信息。我意识到创建自定义模块的需要很尴尬。我希望在未来的版本中简化配置部署特定缓存容器的过程。
我对这个讨论非常感兴趣,因为我在 wildfly 30 + vaadin 框架 v24 上遇到了类似的问题。
我当前在 kubernetes 中部署了一个应用程序,它使用 vaadin 建议的粘性会话并在 web.xml 中禁用可分发,以便 infinispan 不会尝试将会话发送到其他节点。我基本上认为我必须为 vaadin 填充在 httpsession 中的属性实现某种原型流外部化器,以便可以将其写入 infinispan 缓存。
您的解决方案有效吗?