gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:46:08 24 4
gpt4 key购买 nike

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

我正在存储 BinaryValue在 Riak 2.0 中,封装在 RiakObject 中。我需要提供我自己的ConflictResolver处理 sibling ,但为了做到这一点,我需要提取其他数据。该数据源自存储对象的 key 。

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

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

最佳答案

不确定这是否是最好的方法,但它似乎有效:

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

    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. 为#1 中的类注册#2 中的转换器:

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

在转换期间,对象的上下文被传输,观察 annotations 。自定义转换器只需要传输数据的值部分。

关于java - 在冲突解决期间确定 RiakObject 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29647674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com