2.2. 创建序列化上下文初始化器
序列化上下文初始化器可让您在 Data Grid 中注册以下内容:
- 描述用户类型的 protobuf 模式。
- 提供序列化和解序列化功能的 Marshallers。
在高级别中,您应该执行以下操作来创建序列化上下文初始化器:
- 在您的 Java 类中添加 ProtoStream 注解。
-
使用 Data Grid 提供的 ProtoStream 处理器编译您的
SerializationContextInitializer实现。
org.infinispan.protostream.MessageMarshaller 接口已弃用,计划在以后的 ProtoStream 版本中删除。您应该忽略显示如何使用 MessageMarshaller 的代码示例或文档,直到它被完全删除。
2.2.1. 添加 ProtoStream 处理器 复制链接链接已复制到粘贴板!
Data Grid 提供了一个 ProtoStream 处理器工件,用于在编译时处理类中的 Java 注解,以生成 Protobuf 模式、附带的 marshallers 和 SerializationContextInitializer 接口的共识实现。
流程
使用提供的范围,将protostream-processor依赖项添加到pom.xml中。注意只有编译时需要这个依赖项,因此您应该使用
提供的范围或将其标记为可选。您还应确保protostream-processor没有作为传输依赖项传播。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.2.2. 在 Java 类中添加 ProtoStream 注解 复制链接链接已复制到粘贴板!
通过向 Java 类及其成员添加注解来声明 ProtoStream 元数据。然后,数据网格使用 ProtoStream 处理器从这些注解生成 Protobuf 模式和相关 marshallers。
流程
使用
@ProtoField标注您要 marshall 的 Java 字段,可直接在字段或 getter 或 setter 方法上添加。Java 类中的任何非注解字段都是临时的。例如,您有一个带有 15 个字段的 Java 类,并注解了其中五个字段。生成的架构仅包含 5 个字段,在 Data Grid 中存储类实例时,只有五个字段才会被编译。
-
使用
@ProtoFactory为不可变对象注解构造器。注解的构造器必须初始化标有@ProtoField的所有字段。 -
使用
@ProtoEnumValue注解任何 Java 枚举的成员。
以下 Author.java 和 Book.java 示例显示标有 @ProtoField 和 @ProtoFactory 的 Java 类:
Author.java
Book.java
以下 Language.java 示例显示了一个 Java enum,带有 @ProtoEnumValue 以及对应的 Protobuf 模式:
language.java
language.proto
2.2.3. 创建 ProtoStream 适配器类 复制链接链接已复制到粘贴板!
ProtoStream 提供了一个 @ProtoAdapter 注解,您可以使用它来 marshall 外部第三方 Java 对象类,您无法直接注解。
流程
创建一个
适配器类并添加@ProtoAdapter注释,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.2.4. 生成序列化上下文初始化器 复制链接链接已复制到粘贴板!
添加 ProtoStream 处理器并给 Java 类添加 @AutoProtoSchemaBuilder 注解后,您可以将 @AutoProtoSchemaBuilder 注解添加到接口,以便 Data Grid 生成 Protobuf 模式、附带的 marshallers 以及 SerializationContextInitializer 的合并实现。
默认情况下,生成的实现名称是注解的类名称,带有 "Impl" 后缀。
流程
定义一个扩展
GeneratedSchema或其超级接口SerializationContextInitializer的接口。注意GeneratedSchema接口包含访问 Protobuf 模式的方法,而SerializationContextInitializer接口只支持注册方法。-
使用
@AutoProtoSchemaBuilder注解接口。 -
确保
includeClasses参数包含生成的SerializationContextInitializer实现的所有类。 -
使用
schemaFileName参数为生成的.proto模式指定一个名称。 -
在
target/classes下设置一个路径,其中使用schemaFilePath参数生成 schema 文件。 -
使用
schemaPackageName参数为生成的.proto模式指定软件包名称。
以下示例显示了带有 @AutoProtoSchemaBuilder 标注的 GeneratedSchema 接口:
后续步骤
如果您使用嵌入式缓存,Data Grid 会自动注册 SerializationContextInitializer 实现。
如果使用远程缓存,您必须将 SerializationContextInitializer 实现注册到 Data Grid Server。
2.2.5. 注册序列化上下文初始化器 复制链接链接已复制到粘贴板!
对于嵌入式缓存,Data Grid 会自动使用 java.util.ServiceLoader 在注解的 SerializationContextInitializer 实现中注册序列化上下文和 marshallers。
如果您希望,您可以禁用 SerializationContextInitializer 实现的自动注册,然后手动注册。
如果手动注册一个 SerializationContextInitializer 实现,它将禁用自动注册。然后您必须手动注册所有其他实现。
流程
为
AutoProtoSchemaBuilder.service注释设置false。@AutoProtoSchemaBuilder( includeClasses = SomeClass.class, ... service = false )@AutoProtoSchemaBuilder( includeClasses = SomeClass.class, ... service = false )Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
手动以编程方式或声明性注册
SerializationContextInitializer实现,如下例所示:
声明
<serialization>
<context-initializer class="org.infinispan.example.LibraryInitializerImpl"/>
<context-initializer class="org.infinispan.example.another.SCIImpl"/>
</serialization>
<serialization>
<context-initializer class="org.infinispan.example.LibraryInitializerImpl"/>
<context-initializer class="org.infinispan.example.another.SCIImpl"/>
</serialization>
programmatic
GlobalConfigurationBuilder builder = new GlobalConfigurationBuilder();
builder.serialization()
.addContextInitializers(new LibraryInitializerImpl(), new SCIImpl());
GlobalConfigurationBuilder builder = new GlobalConfigurationBuilder();
builder.serialization()
.addContextInitializers(new LibraryInitializerImpl(), new SCIImpl());
2.2.6. 将 Protobuf 模式注册到 Data Grid 服务器 复制链接链接已复制到粘贴板!
如果要执行 Ickle 查询或从 application/x-protostream 转换到其他介质类型,您必须将 Protobuf 模式注册到 Data Grid Server。
先决条件
使用 ProtoStream 处理器生成
SerializationContextInitializer实现。构建完成后,您可以在
target/<schemaFilePath>/ 目录中找到生成的 Protobuf 模式。
流程
执行以下操作之一,将生成的 Protobuf 模式注册到 Data Grid 服务器:
使用 Data Grid 命令行界面(CLI)、REST 接口或
ProtobufMetadataManagerJMX MBean 将生成的 Protobuf 模式添加到专用的___protobuf_metadata缓存中。此方法可确保 Data Grid 自动在集群中分发您的模式。
注意如果为缓存启用安全授权,用户必须具有
CREATE权限才能将模式添加到___protobuf_metadata缓存中。如果使用默认授权设置,请至少为用户分配deployer角色。使用带有 Hot Rod 客户端生成的
SerializationContextInitializer实现来注册 Protobuf 模式,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
SerializationContextInitializer实现和自定义类将 JAR 文件添加到$RHDG_HOME/server/lib目录。当您这样做时,Data Grid 服务器在启动时注册 Protobuf 模式。但是,您必须将存档添加到每台服务器安装中,因为模式不会保存在
___protobuf_metadata缓存中,或者在集群中自动分发。注意如果您需要 Data Grid 服务器执行任何
application/x-protostream到application/x-java-object转换,则必须执行此操作,在这种情况下,还必须为您的 POJO 添加任何 JAR 文件。
后续步骤
使用您的 Hot Rod 客户端注册 SerializationContextInitializer,如下例所示:
2.2.7. 手动序列化上下文初始化器实现 复制链接链接已复制到粘贴板!
Data Grid 强烈建议您手动实施 SerializationContextInitializer 或 GeneratedSchema 接口。
可以使用 ProtobufTagMarshaller 和 RawProtobufMarshaller 注解手动实现 SerializationContextInitializer 或 GeneratedSchema 接口。
但是,手动实现需要大量开销,且容易出错。使用 protostream-processor 工件生成的实现是配置 ProtoStream marshalling 更有效且可靠的方法。