import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.beans.PropertyVetoException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Description:
*
* @author
**/
public class SynWork implements Runnable {
private Logger logger = LoggerFactory.getLogger(SynWork.class);
ComboPooledDataSource cpds;
String sql;
AtomicBoolean inWork;
Timestamp lastMaxTime;
public SynWork(ComboPooledDataSource dataSource, String sql, AtomicBoolean inWork) throws PropertyVetoException, SQLException {
this.cpds = new ComboPooledDataSource();
this.cpds.setDriverClass(dataSource.getDriverClass());
cpds.setJdbcUrl(dataSource.getJdbcUrl());
cpds.setUser(dataSource.getUser());
cpds.setPassword(dataSource.getPassword());
cpds.setMinPoolSize(dataSource.getMinPoolSize());
cpds.setAcquireIncrement(dataSource.getAcquireIncrement());
cpds.setMaxPoolSize(dataSource.getMaxPoolSize());
cpds.setMaxStatements(dataSource.getMaxStatements());
this.sql = sql;
this.inWork = inWork;
lastMaxTime = new DBUtil().getMax(new QueryRunner(cpds), "PZ_RQ");
}
@Override
public void run() {
try {
//init();
if (inWork.get()) {
return;
}
inWork.set(true);
//获取当前日历
Calendar tmpCal = Calendar.getInstance();
//设置最早的同步时间
if (lastMaxTime == null) {
lastMaxTime = new Timestamp((new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("1990-00-00 00:00:00")).getTime());
}
//同步的起始时间
LocalDate startLocalDate = Instant.ofEpochMilli(lastMaxTime.getTime()).atZone(ZoneOffset.ofHours(8)).toLocalDate();
Timestamp now = new Timestamp(System.currentTimeMillis());
//同步的结束时间
LocalDate endLocalDate = Instant.ofEpochMilli(now.getTime()).atZone(ZoneOffset.ofHours(8)).toLocalDate();
//获取同步起始和结束的时间的间隔天数
long p = ChronoUnit.DAYS.between(startLocalDate, endLocalDate);
//如果两个时间相差年数大于5天,就让上一次的时间加30天
if (p > 5) {
tmpCal.setTimeInMillis(lastMaxTime.getTime());
tmpCal.add(Calendar.DAY_OF_YEAR, 30);
now = new Timestamp(tmpCal.getTimeInMillis());
}
//发出请求,获取数据
String json = getJson(lastMaxTime, now);
System.out.println(json);
//String json = FileUtils.readFileToString(new File("D:\\tmp\\response.json"), "utf-8");
if (json != null && !json.trim().isEmpty()) {
//处理数据,解析数据,将解析完的数据入库
if (dealJson3(json)) {
new DBUtil().delete(new QueryRunner(cpds), lastMaxTime);
}
}
lastMaxTime = now;
} catch (Exception e) {
logger.error(e.getMessage());
e.printStackTrace();
} finally {
//cpds.close();
inWork.set(false);
}
}
public String getJson(Timestamp tstart, Timestamp tEnd) throws IOException {
/* SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sStart = "begin=" + format.format(tstart);
String sEnd = "end=" + format.format(tEnd);
List<String> params = new ArrayList<>();
params.add(sStart);
params.add(sEnd);*/
/*where=0%3D0
time=%3E1479427200000*/
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<String> params = new ArrayList<>();
String where="&where=PZ_RQ<timestamp '"+format.format(tEnd)+"'";
//特殊符号转换
where=where.replaceAll(":", "%3A")
.replaceAll(" ", "+")
.replaceAll("'","%27")
.replaceAll("<","%3C");
String time="&time=time>"+tstart.getTime();
time=time.replaceAll(">","%3E");
params.add(where);
params.add(time);
System.out.println(params);
String url = "http://17.1.31.12/arcgis/rest/services/TDGY/TA_TDGY_GCS2000/MapServer/0/query?text=&objectIds=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&relationParam=&outFields=*&returnGeometry=true&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&returnDistinctValues=false&resultOffset=&resultRecordCount=&queryByDistance=&returnExtentsOnly=false&datumTransformation=¶meterValues=&rangeValues=&f=pjson";
url+=where;
url+=time;
return RestUtil.httpGet2(url, null);
}
/**
* 修改过后的---------可用
*
* @param json
* @return
*/
public boolean dealJson3(String json) throws ExecutionException, InterruptedException, ParseException, UnsupportedEncodingException {
//获取请求的数据,只获取请求到的要如何库的数据
JSONObject jsonObject = JSON.parseObject(json);
List<JSONObject> list = (List<JSONObject>) jsonObject.get("features");
List<Map<String, Object>> data = new Gson().fromJson(list.toString(), new TypeToken<List<Map<String, Object>>>() {
}.getType());
if (data == null) {
return false;
}
int submitnum = 0;
CompletionService completionService = new ExecutorCompletionService<SynFinishResult>(
SynThreadPool.getExec());
//批处理数据数量
int batchLen = CfgUtil.batchnum > data.size() ? data.size() : CfgUtil.batchnum;
Object[][] nTmpParams = new Object[batchLen][];
int tmpct = 0;
//遍历数据几点数据数组
for (int i = 0; i < data.size(); i++) {
//具体的数据节点数据
Map<String, Object> map = (Map<String, Object>) data.get(i).get("attributes");
KvpMap nMap = new KvpMap(map);
//要插入的sql参数
Object[] nTmp = new Object[CfgUtil.fields.size()];
//获取要插入的参数
for (int j = 0; j < CfgUtil.fields.size() - 1; j++) {
/* clob字段,读取地理位置信息字段
if (CfgUtil.fields.get(j).getFldName().equalsIgnoreCase("aaa")) {
nTmp[j] = new String(Base64.getDecoder().decode(((String)nMap.get(CfgUtil.fields.get(j).getFldName())).getBytes()), "utf-8");
} else */
//时间字段
if (CfgUtil.fields.get(j).getFldName().contains("PZ_RQ")) {
if (nMap.get(CfgUtil.fields.get(j).getFldName()) != null) {
nTmp[j] = new Tim
没有合适的资源?快使用搜索试试~ 我知道了~
数据同步工具类,使用Rest接口同步数据
共65个文件
class:16个
jar:16个
java:13个
需积分: 49 14 下载量 78 浏览量
2019-10-25
20:50:45
上传
评论
收藏 8.21MB ZIP 举报
温馨提示
这是一个利用java中的定时任务和jdbc去同步数据库中的数据一个工具类。 1、在配置文件中synnum同步的数量必须要大于接口查询出来的数量。 2、在解析json数据的时候,如果同步记录数只有一条会同步不到,需要将其中的一个if记录数等于1的判断去掉。
资源推荐
资源详情
资源评论
收起资源包目录
RestToOracle.zip (65个子文件)
RestToOracle
src
main
resources
syn.properties 628B
log4j.properties 1KB
java
META-INF
MANIFEST.MF 389B
GsonUtils.java 1KB
SynWork.java 13KB
SynFinishResult.java 865B
DBUtil.java 2KB
SynThreadPool.java 1KB
SynBatchInsertTask.java 2KB
TimeUtil.java 471B
RestUtil.java 3KB
KvpMap.java 1KB
CfgUtil.java 2KB
PropertieFileUtil.java 2KB
SynRest.java 4KB
FieldInfo.java 639B
test
java
pom.xml 4KB
out
artifacts
RestToOracle_jar
gson-2.8.5.jar 236KB
RestToOracle.jar 23KB
mchange-commons-java-0.2.15.jar 609KB
annotations-13.0.jar 17KB
slf4j-api-1.7.28.jar 40KB
commons-lang3-3.9.jar 492KB
kotlin-stdlib-1.3.41.jar 1.23MB
ojdbc8.jar-1.0.0.jar 3.97MB
okio-2.2.2.jar 178KB
commons-io-2.6.jar 210KB
c3p0-0.9.5.4.jar 488KB
log4j-1.2.17.jar 478KB
okhttp-4.1.0.jar 669KB
kotlin-stdlib-common-1.3.41.jar 158KB
commons-dbutils-1.7.jar 95KB
target
classes
RestUtil.class 4KB
GsonUtils.class 651B
SynFinishResult.class 1024B
SynThreadPool.class 1KB
SynWork$1.class 580B
CfgUtil.class 2KB
DBUtil.class 3KB
FieldInfo.class 939B
syn.properties 628B
log4j.properties 1KB
SynWork.class 13KB
GsonUtils$1.class 2KB
TimeUtil.class 704B
KvpMap.class 2KB
PropertieFileUtil.class 2KB
SynWork$2.class 561B
SynRest.class 5KB
SynBatchInsertTask.class 2KB
RestToOracle-1.0-SNAPSHOT.jar 25KB
maven-archiver
pom.properties 117B
generated-sources
annotations
maven-status
maven-compiler-plugin
compile
default-compile
inputFiles.lst 702B
createdFiles.lst 271B
testCompile
default-testCompile
inputFiles.lst 0B
.idea
misc.xml 532B
libraries
lib__2_.xml 288B
lib.xml 284B
workspace.xml 41KB
uiDesigner.xml 9KB
artifacts
RestToOracle_jar2.xml 3KB
RestToOracle_jar.xml 2KB
inspectionProfiles
Project_Default.xml 1KB
compiler.xml 545B
$PRODUCT_WORKSPACE_FILE$ 489B
共 65 条
- 1
资源评论
甜的柠檬酸
- 粉丝: 892
- 资源: 55
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功