在冲突解决期间确定RiakObject的位置

时间:2015-04-15 10:21:34

标签: java riak

我正在将我的Java代码从Riak Client 1.4迁移到Riak Client 2.0。

我在Riak 2.0中存储BinaryValue,封装在RiakObject中。我需要提供自己的ConflictResolver来处理兄弟姐妹,但为了做到这一点,我需要提取其他数据。此数据源自存储对象的密钥。

在Riak 1.4中,我使用了IRiakObject,它暴露了getKey()。 Riak 2.0的RiakObject不提供此功能。

如何在Location期间确定对象的ConflictResolver.resolve(List<RiakObject> siblings)(特别是密钥)?

1 个答案:

答案 0 :(得分: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. 从#1注册#4的新冲突解决程序:

    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);
    
  7. 在转换过程中,会传输对象的上下文,并观察annotations。自定义转换器只需要传输数据的值部分。