我正在将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)(特别是键)?

最佳答案

不知道这是否是最好的方法,但似乎可行:


创建一个POJO作为二进制数据的容器。用String注释@RiakKey字段:

public class Chunk {

    @RiakKey
    public String   chunkId;

    public byte[]   data;
}

创建一个自定义转换器:

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");
    }
}

将#2的转换器注册为#1的类:

ConverterFactory.getInstance().registerConverterForClass(Chunk.class, new ChunkConverter());

为#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;
        ...
    }
}

从#4注册新的冲突解决程序到#1的类中:

ConflictResolverFactory.getInstance().registerConflictResolver(Chunk.class, new ChunkResolver());

从Riak提取对象时,请从#1指定类作为值的类型:

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



在转换过程中,遵循annotations的方式传送对象的上下文。定制转换器仅需要传输数据的价值部分。

10-01 05:50