一、Maven依赖以及JDK
1. Maven Pom
<dependency>
<groupId>com.aliyun.datahub</groupId>
<artifactId>aliyun-sdk-datahub</artifactId>
<version>2.12.3-public</version>
</dependency>
//这个一定要加,否则会报错(5001好像是,记不清了)
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.27</version>
</dependency>
2. JDK
jdk: >= 1.7
二、 demo
- 使用DataHub服务之前,需要注册阿里云云账号,利用阿里云账号的AccessId与AccessKey接入DataHub服务。
- 登录DataHub Web Console页面,创建Topic。
示例如下:
- 写入数据与获取数据
import com.aliyun.datahub.client.DatahubClient;
import com.aliyun.datahub.client.DatahubClientBuilder;
import com.aliyun.datahub.client.auth.AliyunAccount;
import com.aliyun.datahub.client.common.DatahubConfig;
import com.aliyun.datahub.client.http.HttpConfig;
import com.aliyun.datahub.client.model.*;
import com.aliyun.datahub.exception.InvalidCursorException;
import java.util.ArrayList;
import java.util.List;
public class TestDemo {
// Endpoint以Region: 华东2(上海)为例
private static final String endpoint = "https://dh-cn-shanghai.aliyuncs.com";
private static final String accessId = "<YourAccessKeyId>";
private static final String accessKey = "<YourAccessKeySecret>";
private static DatahubClient datahubClient;
private static final String projectName = "testdemo";
private static final String topicName = "test";
// 可通过listShard接口获取shard列表,所有ACTIVE的shard均可使用,本例使用"0"
private static final String shardId = "0";
public static DatahubClient createDatahubClient(){
// 创建DataHubClient实例
DatahubClient client = DatahubClientBuilder.newBuilder()
.setDatahubConfig(
new DatahubConfig(endpoint,
// 是否开启二进制传输,服务端2.12版本开始支持
new AliyunAccount(accessId, accessKey), true))
//专有云使用出错尝试将参数设置为 false
// HttpConfig可不设置,不设置时采用默认值
.setHttpConfig(new HttpConfig().setConnTimeout(10000))
.build();
return client;
}
public static void insert(){
if(datahubClient == null){
datahubClient = createDatahubClient();
}
// topic schema
// // 一
// RecordSchema schema = new RecordSchema();
// schema.addField(new Field("t1",FieldType.STRING));
// schema.addField(new Field("t2", FieldType.STRING));
// 二
// TUPLE类型的Topic需要设置schema,也可直接通过getTopic获取
RecordSchema schema = datahubClient.getTopic(projectName, topicName).getRecordSchema();
// generate 10 records
List<RecordEntry> recordEntries = new ArrayList<>();
for(int i = 0; i < 10; ++i) {
RecordEntry recordEntry = new RecordEntry();
// set attributes
recordEntry.addAttribute("key1", "value1");
// set tuple data
TupleRecordData data = new TupleRecordData(schema);
data.setField("t1", "HelloWorld");
data.setField("t2", "1234567");
recordEntry.setRecordData(data);
recordEntries.add(recordEntry);
}
// 服务端从2.12版本开始支持,之前版本请使用putRecords接口
datahubClient.putRecordsByShard(projectName, topicName, shardId, recordEntries);
}
public static void query(){
if(datahubClient == null){
datahubClient = createDatahubClient();
}
// 数据读取
// 每次限读100条,最大不可超过1000
int recordLimit = 100;
// Tuple Topic schema
RecordSchema schema = new RecordSchema();
schema.addField(new Field("t1", FieldType.STRING));
schema.addField(new Field("t2", FieldType.STRING));
//获取cursor
// 注: 正常情况下,getCursor只需在初始化时获取一次,然后使用getRecords的nextCursor进行下一次读取
// String cursor = datahubClient.getCursor(projectName, topicName, shardId, CursorType.LATEST).getCursor();//这里获取最新的一条记录
String cursor = datahubClient.getCursor(projectName, topicName, shardId, CursorType.SYSTEM_TIME,1559059200000L).getCursor();
int i = 0;
while(true){
try{
// 读取数据
GetRecordsResult result = datahubClient.getRecords(projectName, topicName, shardId, schema, cursor, recordLimit);
// 如果有数据则处理,无数据需sleep后重新读取
if (result.getRecordCount() > 0) {
for (RecordEntry entry : result.getRecords()) {
i++;
System.out.println("i:"+i);
//获取DataHub数据上传的系统时间
long systemTime = entry.getSystemTime();
System.out.println("systemTime:"+systemTime);
TupleRecordData data = (TupleRecordData) entry.getRecordData();
System.out.println("t1:" + data.getField("t1"));
System.out.println("t2:" + data.getField("t2"));
}
}
// 拿到下一个游标
cursor = result.getNextCursor();
}catch(InvalidCursorException ex){
// 非法游标或游标已过期,建议重新定位后开始消费
cursor = datahubClient.getCursor(projectName, topicName, shardId, CursorType.OLDEST).getCursor();
}
}
}
// public static void main(String[] args){
// insert();
// System.out.println("---------插入成功,去获取数据----------");
// query();
// }
}