1、首先需要用到的一些开发工具:
JDK(我用的1.7)
MyEclipse 2014
JavaService
JavaService可在官网下载,下载地址:http://javaservice.objectweb.org,下载之前官方需要确认你的一些个人信息,提交后可以进入资源下载页面,我这里下载的是2.0.10版本。解压后有很多文件,我们只需要用到其中的JavaService.exe。
2、接着编写一个Java工程
代码:
001、调用Kettle
package com.kettle;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.util.EnvUtil;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
/**
* kettle version 5.4.0.1-130
* ClassName: KettleUtil
* @Description: TODO
* @Author: Pru
* @Email : Pengru@mail.ru
* @date 2017年12月12日 上午10:24:11
*/
public class KettleUtil {
/**
*
* @Description: TODO
* @param @param transFileName
* @param @throws Exception
* @return void
* @throws
* @Author: Pru
* @Email : Pengru@mail.ru
* @date 2017年12月12日
*/
public static void callNativeTrans(String transFileName) throws Exception{
callNativeTransWithParams(null, transFileName);
}
/**
* 调用trans文件 带参数的
* @Description: TODO
* @param @param params
* @param @param transFileName
* @param @throws Exception
* @return void
* @throws
* @Author: Pru
* @Email : Pengru@mail.ru
* @date 2017年12月12日
*/
private static void callNativeTransWithParams(String[] params,String transFileName) throws Exception {
// 初始化
KettleEnvironment.init();
EnvUtil.environmentInit();
TransMeta transMeta = new TransMeta(transFileName);
//转换
Trans trans = new Trans(transMeta);
//执行
trans.execute(params);
//等待结束
trans.waitUntilFinished();
//抛出异常
if(trans.getErrors() > 0){
throw new Exception("There are errors during transformation exception!(传输过程中发生异常)");
}
}
/**
* 调用job文件
* @Description: TODO
* @param @param jobName
* @param @throws Exception
* @return void
* @throws
* @Author: Pru
* @Email : Pengru@mail.ru
* @date 2017年12月12日
*/
public static void callNativeJob(String jobName) throws Exception{
// 初始化
KettleEnvironment.init();
JobMeta jobMeta = new JobMeta(jobName,null);
Job job = new Job(null, jobMeta);
//向Job 脚本传递参数,脚本中获取参数值:${参数名}
//job.setVariable(paraname, paravalue);
job.start();
job.waitUntilFinished();
if (job.getErrors() > 0) {
throw new Exception("There are errors during job exception!(执行job发生异常)");
}
}
}
002、服务代码
package com.erpservice;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import com.kettle.KettleUtil;
public class Service implements Runnable {
private static Logger LOGGER = LogManager.getLogger(ERPService.class.getName());
private boolean runFlag = true;
/**
* 设定服务线程运行标志值
*
* @param runFlag
*/
public synchronized void setRunFlag(boolean runFlag) {
this.runFlag = runFlag;
}
/**
* 取得服务线程运行标志值
*
* @param void
*/
@SuppressWarnings("unused")
private synchronized boolean getRunFlag() {
return runFlag;
}
@Override
public void run() {
System.out.println(getLocalTime()+"服务线程开始运行");
LOGGER.info(getLocalTime()+"-----------kettle定时任务运行开始-----------");
String transFileName = "C:/Softwares/data-integration/samples/test/test_ccgc.kjb";
try {
KettleUtil.callNativeJob(transFileName);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
LOGGER.info(getLocalTime()+"-----------kettle定时任务运行结束-----------");
System.out.println("服务线程结束运行");
}
public String getLocalTime(){
String time ="[";
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
time += df.format(new Date()).toString();
time+="]";
return time;
}
}
package com.erpservice;
public class ERPService {
private static Thread thread = null;
private static Service service = null;
/**
* 退出服务方法(该方法必须有参数 String [] args)
*
* @param args
*/
public static void StopService(String[] args) {
System.out.println(service.getLocalTime()+"停止服务");
service.setRunFlag(false);
}
/**
* 启动服务方法(该方法必须有参数 String [] args)
*
* @param args
* @throws Exception
*/
public static void StartService(String[] args) throws Exception {
// 产生服务线程
service = new Service();
thread = new Thread(service);
System.out.println("\r\n"+service.getLocalTime()+"-----------启动服务-----------");
try {
// 将服务线程设定为用户线程,以避免StartService方法结束后线程退出
thread.setDaemon(false);
if (!thread.isDaemon()) {
System.out.println(service.getLocalTime()+"成功设定线程为用户线程!");
}
// 启动服务线程
thread.start();
} catch (SecurityException se) {
System.out.println(service.getLocalTime()+"线程类型设定失败!");
}
}
public static void main(String[] args) throws Exception {
// new Service().run();
ERPService.StartService(null);
}
}
3、编写完工程代码后,将工程打包为jar包。
因为有依赖包我自己建了一个MANIFEST.MF文件
Manifest-Version: 1.0
Class-Path: lib/commons-logging-1.1.1.jar lib/commons-vfs-20100924-pentaho.jar lib/kettle-core-5.4.0.1-130.jar lib/kettle-dbdialog-5.4.0.1-130.jar lib/kettle-engine-5.4.0.1-130.jar lib/log4j-1.2.17.jar lib/metastore-5.4.0.1-130.jar lib/ojdbc6.jar
Main-Class: com.erpservice.ERPService
右键项目-Export,选择打包为JAR包
然后NEXT --> NEXT -->选中自己建的MANIFEST.MF文件
4、JAR包打包完毕,接下来开始做注册服务的工作。
将之前下载的JavaService解压得到JavaService.exe后,将它和jar包,统一放到文件夹D:\ERPService内(注意,不要有中文路径,否则服务启动会失败)。
其中err.log和out.log是运行服务后JavaService生成的日志文件。
以管理员身份运行cmd,CD到JavaService.exe和jar包所在的目录
然后执行命令:JavaService.exe -install ERPService "%JAVA_HOME%/jre/bin/server/jvm.dll" -Xmx256m -Djava.class.path="%JAVA_HOME%/lib/tools.jar;%CD%/erpservice.jar" -start com.erpservice.ERPService -method StartService -stop com.erpservice.ERPService -method StopService -out "%CD%/out.log" -err "%CD%/err.log" -current "%CD%" -auto
启动服务命令:net start ERPService
停止服务命令:net stop ECService
卸载服务命令:JavaService -uninstall ERPService