dts reader
package com.aliyun.dts.connect; import com.alibaba.fastjson.JSONObject;
import com.aliyun.drc.client.message.DataMessage;
import com.aliyun.drc.clusterclient.ClusterClient;
import com.aliyun.drc.clusterclient.ClusterListener;
import com.aliyun.drc.clusterclient.DefaultClusterClient;
import com.aliyun.drc.clusterclient.RegionContext;
import com.aliyun.drc.clusterclient.message.ClusterMessage; import java.io.UnsupportedEncodingException;
import java.util.List; public class DTSReader { private final ClusterClient dts_client; public DTSReader(String accessKey, String accessSecret, String subscribeInstanceID) throws Exception {
this.dts_client = initClusterClient(accessKey, accessSecret, subscribeInstanceID);
} private ClusterClient initClusterClient(String accessKey, String accessSecret, String subscribeInstanceID)
throws Exception {
// 创建一个context,仅是属性设置
RegionContext context = new RegionContext();
// 运行SDK的服务器是否使用公网IP连接DTS(若使用内网IP访问,需要设置false)
// 在订阅任务启动时,需要网络连接时需要关注该设置项
context.setUsePublicIp(true);
// 设置用户accessKey secret
context.setAccessKey(accessKey);
context.setSecret(accessSecret); // 创建消费者
ClusterClient client = new DefaultClusterClient(context);
ClusterListener listener = new ClusterListener() {
// @Override
public void noException(Exception e) {
// TODO Auto-generated method stub
e.printStackTrace();
} // @Override
public void notify(List<ClusterMessage> messages) throws Exception {
//处理订阅任务收到的消息
for (ClusterMessage message : messages) {
replicateMessage(message);
}
}
}; client.askForGUID(subscribeInstanceID);
client.addConcurrentListener(listener); return client;
} private void replicateMessage(final ClusterMessage message) {
// 处理消息
try {
// 转换消息格式并处理
convertRecord(message);
// 确认消息以消费
message.ackAsConsumed();
} catch (Exception e) {
// TODO 根据业务需求进行必要的重试
e.printStackTrace();
}
} private void convertRecord(ClusterMessage message) throws UnsupportedEncodingException {
DataMessage.Record record = message.getRecord();
System.out.println("Record Op type:" + record.getOpt().toString());
JSONObject jsonRecord;
String key = null;
switch (record.getOpt()) {
case INSERT: // 数据插入
jsonRecord = convertFields(record, 0, 1);
key = record.getPrimaryKeys();
System.out.println("Record Insert:Json format:" + jsonRecord.toJSONString());
break;
case UPDATE:// 数据更新
case REPLACE:// replace操作
JSONObject oldJsonRecord = convertFields(record, 0, 2);
System.out.println("Record Update Before:Json format:" + oldJsonRecord.toJSONString());
jsonRecord = convertFields(record, 1, 2);
System.out.println("Record Update Before:Json format:" + jsonRecord.toJSONString());
key = record.getPrimaryKeys();
break;
case DELETE:// 数据删除
jsonRecord = convertFields(record, 0, 1);
System.out.println("Record Delete:Json format:" + jsonRecord.toJSONString());
key = record.getPrimaryKeys();
break;
default:
return;
}
//数据表中对主Key列名
System.out.println("PrimaryKey Column Name:" + key);
//drds中物理数据库名和物理数据表名
System.out.println("Record DB Name:"+record.getDbname()+",Table Name:"+record.getTablename());
//drds中逻辑数据库名和逻辑表名
System.out.println("Record Logical DB Name:"+record.getLogicalDbname()+",Table Name:"+record.getLogicalTablename()); } // 将消息组成JSON格式输出
private JSONObject convertFields(DataMessage.Record record, int start, int step)
throws UnsupportedEncodingException {
List<DataMessage.Record.Field> fields = record.getFieldList();
JSONObject ret = new JSONObject();
for (int i = start; i < fields.size(); i += step) {
DataMessage.Record.Field field = fields.get(i);
JSONObject object = new JSONObject();
object.put("type", field.getType().toString());
object.put("encoding", field.getEncoding());
if (field.getValue() != null) {
object.put("value", field.getValue().toString(field.getEncoding()));
} else {
object.put("value", null);
}
ret.put(field.getFieldname(), object);
}
return ret;
} public void start() throws Exception {
System.out.println("Start DTS subscription client...");
dts_client.start();
} public void stop() throws Exception {
System.out.println("Stop DTS Subscription Client...");
dts_client.stop();
} }
dts reader的更多相关文章
- InputStream、InputStreamReader和Reader的关系
InputStream:得到的是字节输入流,InputStream.read("filename")之后,得到字节流 Reader:读取的是字符流 InputStreamReade ...
- Distribution1:Distribution Reader
在transactional replication中,在publication中执行了一个更新,例如:update table set col=? Where ?,如果table中含有大量的数据行, ...
- Reader与InputStream两个类中的read()的区别
InputStream类的read()方法是从流里面取出一个字节,他的函数原型是 int read(); ,Reader类的read()方法则是从流里面取出一个字符(一个char),他的函数原型也是 ...
- Ubuntu 12.04安装Adobe Reader
原本从Adobe 官方网站下载了 Adobe Reader, 是个rpm包,先用agt-get 装了rpm(sudo apt-get install rpm), 一安装(rpm -ivh AdobeR ...
- .dtsi .dts dtc dtb 是什么
基础 .dts: device tree source .dtsi: device tree source include .dts比作源文件,.dtsi比作头文件. dtc是linux源码 /s ...
- SSIS之-DTS对象&事件
1.Dts 是类 Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel 类的一个实例,Dts 对象有 7 个属性和一个方法,以下是DTS ...
- Adobe Reader/Acrobat修改页面底色为豆沙绿
Adobe Acrobat_Pro_8修改PDF页面底色为豆沙绿保护视力(同样适用于Adobe Reader) http://jingyan.baidu.com/article/9989c746189 ...
- multithreading - Reader/Writer Locks in C++
You Only Need To Note This: only 1 single thread can acquire an upgrade_lock at one time. others are ...
- AttributeError: '_csv.reader' object has no attribute 'next'
我在使用pyhon3.4运行以下代码时报错:AttributeError: '_csv.reader' object has no attribute 'next' import csv import ...
随机推荐
- Jmeter - 生成Html报告
同步更新至个人博客:https://njlife.top/2019/07/12/Jmeter-%E7%94%9F%E6%88%90Html%E6%8A%A5%E5%91%8A/ Jmeter GUI提 ...
- P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- 去除chrome网站https的安全检测
chrome://net-internals/#hsts 访问该网址,把要禁止检测的网址放在下面:
- SecureCRT中解决乱码的问题
SecureCRT中文乱码的问题,解决方法如下: 打开Option菜单,点击Session Options- 在Appearance外观这里,选择编码--UTF-8 一定要记得先保存! ...
- 01 - Element
¶安装 npm 安装 推荐使用 npm 的方式安装,它能更好地和 webpack 打包工具配合使用. npm i element-ui -S CDN 目前可以通过 unpkg.com/element- ...
- LightOJ - 1214-Large Division(数学,同余)
链接: https://vjudge.net/problem/LightOJ-1214 题意: Given two integers, a and b, you should check whethe ...
- LeetCode刷题分类-解题模式
模式1:如果是已经排好序的序列(数组,链表,或是矩阵),我们就可以用二分的变种或是双指针策略 模式2: 如果我们需要处理n个元素中:顶部/最大/最小/最接近的k个元素时,我们就可以用堆来解决了. 模式 ...
- Python学习之--基础语法
一.定义 Python 是一种解释型.面向对象.动态数据类型的高级程序设计语言. 二.Python变量的命名规则 1. 变量名只能包含字母.数字和下划线: 2. 变量名不能包含空格: 3. 不要将Py ...
- 如果对方网站反爬取,封IP了怎么办?
放慢抓取熟速度,减小对目标网站造成的压力,但是这样会减少单位时间内的数据抓取量 使用代理IP(免费的可能不稳定,收费的可能不划算)
- 免sudo使用docker
前沿:通过root安装完docker,在普通用户下执行docker相关命令的时候,报权限不足: 查看sock文件的权限: [hadoop@slave1 monitor]$ ll /var/run/do ...