阿里云 ots(table store)项目应用

项目中我们应用到了ots技术,有些皮毛的总结见解。

    首先看了阿里有关ots的介绍:https://help.aliyun.com/document_detail/ots/SDK/java-sdk.html。

    在官网上有介绍说:

String endPoint = "<your endpoint>";

String accessId = "<your access id>";

String accessKey = "<your access key>";

String instanceName = "<your instance name>";

OTSClient client = new OTSClient(endPoint, accessId, accessKey, instanceName); 


String COLUMN_GID_NAME = "gid";

String COLUMN_UID_NAME = "uid";

String COLUMN_NAME_NAME = "name";

String COLUMN_ADDRESS_NAME = "address";

String COLUMN_AGE_NAME = "age";

String COLUMN_MOBILE_NAME = "mobile";

String tableName = "myTable";


RowPutChange rowChange = new RowPutChange(tableName);

RowPrimaryKey primaryKey = new RowPrimaryKey();

primaryKey.addPrimaryKeyColumn(COLUMN_GID_NAME, PrimaryKeyValue.fromLong(1));

primaryKey.addPrimaryKeyColumn(COLUMN_UID_NAME, PrimaryKeyValue.fromLong(101));

rowChange.setPrimaryKey(primaryKey);

rowChange.addAttributeColumn(COLUMN_NAME_NAME, ColumnValue.fromString("张三"));

rowChange.addAttributeColumn(COLUMN_MOBILE_NAME, ColumnValue.fromString("111111111"));

rowChange.addAttributeColumn(COLUMN_ADDRESS_NAME, ColumnValue.fromString("中国A地"));

rowChange.addAttributeColumn(COLUMN_AGE_NAME, ColumnValue.fromLong(20));

rowChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST)); 

PutRowRequest request = new PutRowRequest();

request.setRowChange(rowChange);

PutRowResult result = client.putRow(request);

int consumedWriteCU = result.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit();

System.out.println("成功插入数据, 消耗的写CapacityUnit为:" + consumedWriteCU);


上面代码主要是 应用程序可以通过putRow接口插入或覆盖一行。

标红的地方表示对RowPrimaryKey类参数的设置。这些参数也是我们request里的参数。

在我们项目中应用(以增加PutRow为例):

   1.request访问的类(Action层)AliOts类,在实力化时创建了OTSClientAsync(异步),将request参数转变成JsonObject data类型的。定义一个方法putrowRequest(JsonObject data)方法:

put() {
    .consumer(, msg -> {
        JsonObject data = (JsonObject) msg.body();
        PutRowRequest request = putRowRequest(data);
        OtsAction<PutRowRequest, PutRowResult> action = OtsAction<>();
        putRow(request, action, msg);
    });
}

  

PutRowRequest putRowRequest(JsonObject data) {
    RowPutChange put = rowPutChange(data);
    PutRowRequest request = PutRowRequest();
    request.setRowChange(put);
    request;
}

这个方法中的方法rowPutChange(data)方法定义在一个基础类(OtsBase类中)

RowPutChange rowPutChange(JsonObject data) {
    String table = data.getString();
    RowPutChange put = RowPutChange(table);
    RowPrimaryKey pk = rowPrimaryKey(data.getJsonObject());
    put.setPrimaryKey(pk);
    JsonObject adds = data.getJsonObject();
    (adds != ) {
        (String key : adds.fieldNames()) {
            Object value = adds.getValue(key);
            (value String) {
                put.addAttributeColumn(key, ColumnValue.((String) value));
            } (value Integer) {
                put.addAttributeColumn(key, ColumnValue.((Integer) value));
            } (value Long) {
                put.addAttributeColumn(key, ColumnValue.((Long) value));
            } (value Double) {
                put.addAttributeColumn(key, ColumnValue.((Double) value));
            } (value Boolean) {
                put.addAttributeColumn(key, ColumnValue.((Boolean) value));
            }
              }
    }
    //设置Condition
    String expectation = data.getString(EXPECTATION);
    if (expectation != null) {
        //是否限制 只有不存在才插入
        if (expectation.equals("NOT_EXIST")) {
            put.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST));
        }
    }
    return put;
}

在AliOts类中条用的另一个方法

putRow(request, action, msg);


putRow(PutRowRequest request, OtsAction<PutRowRequest, PutRowResult> action, Message<Object> msg) {
    Handler<OtsAction<PutRowRequest, PutRowResult>> putHdl = putHdl(msg);
    OtsCallback<PutRowRequest, PutRowResult> cb = OtsCallback<>(putHdl, action);
    (action.getTimes() == ) {
        .putRow(request, cb);
    } {
        .setTimer(, id -> .putRow(request, cb));
    }
}


Handler<OtsAction<PutRowRequest, PutRowResult>> putHdl(Message<Object> msg) {
    action -> {
        (action.succeeded()) {
            PutRowResult result = action.getOc().getOTSResult();
            wcu = result.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit();
            msg.reply(wcu);
        } {
            (action.getTimes() < ) {
                putRow(action.getOc().getOTSRequest(), action, msg);
            } {
                String err;
                (action.hasOtsException()) {
                    err = action.getOe().getMessage();
                } {
                    err = action.getCe().getMessage();
                }
                msg.fail(, err);
            }
        }
    };
}

这样就完成了PutRow添加的功能,其它的方法就跟这个类似。这样下来逻辑很是清楚,基础类的封装成接口类(java1.8中,接口可以有具体类的实现)被实现。还有就是编写代码的规范的常识吧:一个方法如果代码过多,就应该把它里面按照小功能拆分成多个小的方法被调用,这样在自己还是别人review代码时,逻辑都很清楚。

转载于:https://my.oschina.net/u/2523763/blog/546715

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值