自己写个webService服务端,让客户调用,客户调用后生成一个格式文件,再叫Kettle执行job,操作这个文件。
于是思路如下
webservice:
@Override
public void saveUser( User user) {
//生成txt文件
FileUtil.test(user);
//调用kettle
String s = "cmd /c start D:\\pdi-ce-9.0.0.0-423\\data-integration\\pan.bat -rep=local -user=admin -pass=123456 -trans=test -dir=/";
Process ps = null;
try {
ps = Runtime.getRuntime().exec(s);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(ps.getInputStream());
}
FileUtil工具类:
public static void test(User user){
String directory="C:/Users/Pinole5/Desktop/";
String filename="a.txt";
File file=new File(directory);
boolean exists = file.exists();
if (!file.exists()) {
file.mkdirs();
}
File file2=new File(directory,filename);
if (!file2.exists()) {
try {
file2.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//向指定文件中写入文字
FileWriter fileWriter;
try {
fileWriter = new FileWriter("C:/Users/Pinole5/Desktop/a.txt");
//使用缓冲区比不使用缓冲区效果更好,因为每趟磁盘操作都比内存操作要花费更多时间。
//通过BufferedWriter和FileWriter的连接,BufferedWriter可以暂存一堆数据,然后到满时再实际写入磁盘
//这样就可以减少对磁盘操作的次数。如果想要强制把缓冲区立即写入,只要调用writer.flush();这个方法就可以要求缓冲区马上把内容写下去
BufferedWriter sb=new BufferedWriter(fileWriter);
sb.write("id;name;\n");
sb.write(user.getId() + ";" + user.getName() + ";");
sb.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
遇到的问题:生成txt文件后,格式变成了Unix,不再是DOS,需要注意。
待实现:
1.kettle的文本文件输入,要动态文件名
我的想法是,kettle只支持路径为变量,那么webservice生成的文件就给它覆盖掉,覆盖之前把生成的文件copy一份放到指定位置,再写死文件名就相当于动态了,可有一个很严重的问题:并发很高的情况就崩了。
2.文本文件里数据不规范怎么处理,比如下图,除了字段id,name,数据里边还有字段id2,name2,并且这个id2,name2下边的数据都属于id2,name2
这个就有点狗了,有想法和实现后再来补充
本文介绍了如何结合Kettle和WebService实现数据处理流程。通过编写webService服务端生成文件,然后利用Kettle的job操作该文件。在实践中遇到文件格式转换问题(Unix转DOS)、动态文件名的实现以及并发高时可能出现的问题。针对文件名动态化,提出了覆盖文件并复制备份的方法,但并发问题尚待解决。此外,还讨论了文本文件中不规范数据的处理挑战。

2425

被折叠的 条评论
为什么被折叠?



