由于项目需要,写了版针对业务的自动化测试代码,主要应用场景在于由于业务日趋复杂,一些公共代码的改动,担心会影响已有业务。还没进行重写,但知识点还是不少的与大家分享实践下。首先,介绍下整个流处理的业务流程。
首先 从网管实时接入数据到kafka,然后消息接入 进行预处理(这个过程是通过jetty框架,直接用servlet启动的项目,因为考虑到tomcat的并发不够,所以这样用。)随后预处理完 传入kafka,然后storm的不同的topo根据不同的传入类型,进行接入消息的规则匹配,规则是存在于前台的项目中,定时刷入redis(1分钟1刷) 随后加载用户卡数据、用户信息等(这些数据是每晚通过跑mapreduce任务生成的大宽表,直接导入redis),通过redis加载效率非常高,满足实时性(如果redis中不存在数据的情况下,会连接hbase,再进行查询) 随后进行业务处理(有时有些会调各个网管的接口,获取相应业务数据),随后将封装好的数据发总致下游通知拓扑,通知拓扑通过webservice或者restTemple发送值各个其他平台,比如微信,支付宝,短信等,最终将整个运行日志写入hbase。
首先准备下一些需要的公共类,kafkaclient:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
HbaseUtil:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
kafkaClient主要负责将读取报文的信息发送至kafka,随之又topo自行运算,最终使用通过调用hbaseUtil,对相应字段的比对查询。
那么下面对整个自动化测试的流程进行说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
public String readTxt() throws IOException{
StringBuffer sendMessage = new StringBuffer();
BufferedReader br = null;
try {
br = new BufferedReader(
new InputStreamReader(new FileInputStream(MessageText), "UTF-8"));
String line = "";
while((line = br.readLine()) != null){
if (line.contains("
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
1 2 3 |
|
Result result = baseHelper.getResult("EVENT_LOG_DH", messageKey);
//对比字段
baseHelper.compareData(dataMap, result,activityCode);
public Result getResult(String tableName, String rowKey) throws IOException {
Get get = new Get(Bytes.toBytes(rowKey));
Result result = null;
HTableInterface tableInterface = null;
try {
tableInterface = getConnection().getTable(tableName);
result = tableInterface.get(get);
return result;
} catch (Exception e) {
closeConnection();
logger.error("", e);
} finally {
if (tableInterface != null) {
tableInterface.close();
}
}
public void compareData(Map messageData, Result res,List activityCode) throws IOException{
List Messages = new ArrayList();
for (Cell cell : res.rawCells()) {
String qualifier = Bytes.toString(CellUtil.cloneQualifier(cell));
if(Bytes.toString(CellUtil.cloneQualifier(cell)).equalsIgnoreCase("VARIABLESETS")){
System.out.println(qualifier + "[" + new Gson().fromJson(Bytes.toString(CellUtil.cloneValue(cell)), Map.class) + "]");
@SuppressWarnings("unchecked")
Map data = gson.fromJson(Bytes.toString(CellUtil.cloneValue(cell)), Map.class);
String message = "";
for(String datakey : data.keySet()){
if(messageData.containsKey(datakey)){
String dataValue = getString(data,datakey);
String messageValue = getString(messageData,datakey);
if(datakey.equals("dh22")){
dataValue = dataValue.substring(0,dataValue.indexOf("."));
messageValue = messageValue.substring(0,messageValue.indexOf("."));
}
if(dataValue.equals(messageValue)){
message = datakey + " = " + dataValue + " 与报文中的 " + dataValue + "对比相同";
Messages.add(message);
}else{
message = datakey + " = " + dataValue + " 与报文中的 " + dataValue + "不一致!!!";
Messages.add(message);
}
}
}
}
if(Bytes.toString(CellUtil.cloneQualifier(cell)).equalsIgnoreCase("NOTIFY__")){
}
}
if(Messages.size() > 0){
StringBuffer sb = new StringBuffer();
for(String error : Messages){
sb.append(error).append("\n");
}
FileWriter fw = new FileWriter(logFile,true);
fw.write("\n----------------------");
fw.write(sb.toString());
fw.flush();
fw.close();
}else{
String sb = "没有对不上的字段呀";
FileWriter fw = new FileWriter(logFile);
fw.write(sb);
fw.flush();
fw.close();
}
}
public void delHbaseData(String cardNo,String certNo) throws IOException{
String rowkeyCard = HTableManager.generatRowkey(cardNo) ;
String rowKeyUse = HTableManager.generatRowkey(certNo) ;
Delete delData = null;
HTableInterface tableInterface = null;
String tableName = "";
try {
tableInterface = getConnection().getTable(tableName);
tableInterface.delete(delData);
}
return;
} catch (Exception e) {
closeConnection();
logger.error("", e);
} finally {
if (tableInterface != null) {
tableInterface.close();
}
}
}