项目中我们应用到了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代码时,逻辑都很清楚。