Обновление с Infinispan 7 до 10, как работать с UUID в качестве ключа UUID в качестве поля в классе? - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь обновить большой проект, который использовал Infinispan 7, до версии 10.1.3.

Я хотел бы использовать новый маршаллер Prostream, но я не понимаю, как можно использовать UUID как ключ кеша, или даже (проще?) Как поле в классе, который я хочу вставить в кеш.

Мой кэш был доступен следующим образом: Map<UUID, Foo> testUUIDAsKey = manager.getCache("t1");

Вот когда пытаясь поместить значение в кэш, infinispan говорит мне, что он не знает, как маршалировать uuid.

Хорошо, поэтому после прочтения документации я попытался перейти к более простому тестовому примеру: Map<String, Bar> testUUIDAsField = manager.getCache("t2");

Здесь у класса Bar есть поле типа UUID, и я попытался использовать процессор аннотаций protostream, который будет автоматически генерировать и создавать файл прото при использовании правильной аннотации.

Но на этот раз процессор аннотаций говорит мне, что класс UUID должен быть создан с использованием доступного конструктора без аргументов.

Я знаю, что protobuf не может управлять UUID, я могу сохранить значение как strin g или сохраняя часть длинных значений 2 в uuid.

Как я могу зарегистрировать маршаллер UUID, который будет использовать String в качестве представления в конце?

И как я могу сообщить аннотацию процессор, что он должен использовать этот маршаллер?

Тогда, как я могу использовать UUID в качестве ключа?

Спасибо.

1 Ответ

3 голосов
/ 05 марта 2020

В настоящее время Infinispan регистрирует маршаллер Protostream для UUID, но, к сожалению, он находится только на сервере. Я создал ISPN-11426 , чтобы в будущих выпусках (10.1.4.Final и 11.x) можно было маршаллизировать UUID из коробки во встроенном режиме (10.1.4.Final и 11.x).

In в то же время вы можете получить UUID для работы в качестве ключа, создав SerializationContextInitializer и определив класс UUIDMarshaller:


       public static class Initializer implements SerializationContextInitializer {

          @Override
          public String getProtoFileName() {
             return "org.example.package.proto";
          }

          @Override
          public String getProtoFile() throws UncheckedIOException {
             return "package org.example.package;\n" +
                   "message UUID {\n" +
                   "    optional string value = 1;\n" +
                   "}\n";
          }

          @Override
          public void registerSchema(SerializationContext serCtx) {
             serCtx.registerProtoFiles(org.infinispan.protostream.FileDescriptorSource.fromString(getProtoFileName(), getProtoFile()));
          }

          @Override
          public void registerMarshallers(SerializationContext serCtx) {
             serCtx.registerMarshaller(new UUIDMarshaller("org.example.package.UUID"));
          }
       }

    import java.io.IOException;
    import java.util.UUID;

    import org.infinispan.protostream.MessageMarshaller;

    public class UUIDMarshaller implements MessageMarshaller<UUID> {

       private final String typeName;

       /**
        * @param typeName so that marshaller can be used in multiple contexts
        */
       public UUIDMarshaller(String typeName) {
          this.typeName = typeName;
       }

       @Override
       public UUID readFrom(ProtoStreamReader reader) throws IOException {
          return UUID.fromString(reader.readString("value"));
       }

       @Override
       public void writeTo(ProtoStreamWriter writer, UUID uuid) throws IOException {
          writer.writeString("value", uuid.toString());
       }

       @Override
       public Class<? extends UUID> getJavaClass() {
          return UUID.class;
       }

       @Override
       public String getTypeName() {
          return typeName;
       }
    }

Вам нужно обновить org.example.package до чего-то, относящегося к Ваш проект.

Класс Initializer может быть затем предоставлен программно через:

new GlobalConfigurationBuilder().serialization().addContextInitializer(new Initializer());

Или через xml:

      <serialization>
         <context-initializer class="org.example.package.Initializer" />
      </serialization>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...