2015-04-15 3 views
0

Я выполняю миграцию кода Java от Riak Client 1.4 до Riak Client 2.0.Определить местоположение RiakObject во время разрешения конфликта

Я храню BinaryValue в Riak 2.0, инкапсулированный в RiakObject. Мне нужно предоставить свой собственный ConflictResolver, чтобы иметь дело с братьями и сестрами, но для этого мне нужно взять другие данные. Эти данные выводятся из ключа сохраненного объекта.

В Riak 1.4 я использовал IRiakObject, который выставил getKey(). RiakObject Riak 2.0 этого не предлагает.

Как можно определить Location (в частности, ключ) объекта во время ConflictResolver.resolve(List<RiakObject> siblings)?

ответ

2

Не уверен, что это лучший подход, но это, кажется, работает:

  1. Создать POJO в качестве контейнера для двоичных данных. Аннотировать String поле с @RiakKey:

    public class Chunk { 
    
        @RiakKey 
        public String chunkId; 
    
        public byte[] data; 
    } 
    
  2. Создание пользовательского нейтрализатор:

    import com.basho.riak.client.api.convert.ConversionException; 
    import com.basho.riak.client.api.convert.Converter; 
    import com.basho.riak.client.core.util.BinaryValue; 
    public class ChunkConverter extends Converter<Chunk> { 
    
        public ChunkConverter() { 
         super(Chunk.class); 
        } 
    
        public Chunk toDomain(BinaryValue val, String contentType) throws ConversionException { 
         Chunk chunk = newDomainInstance(); 
         chunk.data = val.getValue(); 
        } 
    
        public ContentAndType fromDomain(Chunk chunk) throws ConversionException { 
         return new ContentAndType(BinaryValue.unsafeCreate(chunk.data), "application/octet-stream"); 
        } 
    } 
    
  3. Регистрация преобразователь от # 2 для класса от # 1:

    ConverterFactory.getInstance().registerConverterForClass(Chunk.class, new ChunkConverter()); 
    
  4. Создать разрешение конфликта для класса от # 1:

    public class ChunkConflictResolver implements ConflictResolver<Chunk> { 
    
        public Chunk resolve(List<Chunk> siblings) throws UnresolvedConflictException { 
         if (siblings == null) { 
          return null; 
         } 
         Chunk oneChunk = siblings.get(0); 
         // finally, the key! 
         String key = oneChunk.chunkId; 
         ... 
        } 
    } 
    
  5. Регистрация нового распознаватель конфликта от # 4 для класса от # 1:

    ConflictResolverFactory.getInstance().registerConflictResolver(Chunk.class, new ChunkResolver()); 
    
  6. При получении объекта из Riak, указать класс от # 1 как тип значения:

    Location loc = new Location(...); 
    FetchValue op = new FetchValue.Builder(loc).build(); 
    Chunk chunk = riakClient.execute(op).getValue(Chunk.class); 
    

Во время преобразования контекст объекта переносится, наблюдая за annotations. Пользовательскому конвертеру нужно только передать значение-часть данных.

Смежные вопросы