用Kettle实现自动定时调用存储过程部署到Windows服务

1、首先需要用到的一些开发工具:

JDK(我用的1.7)

MyEclipse 2014

JavaService

JavaService可在官网下载,下载地址:http://javaservice.objectweb.org,下载之前官方需要确认你的一些个人信息,提交后可以进入资源下载页面,我这里下载的是2.0.10版本。解压后有很多文件,我们只需要用到其中的JavaService.exe。

2、接着编写一个Java工程

101941_n2xz_3411429.png

代码:

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

103814_mSSf_3411429.png

启动服务命令:net start ERPService

停止服务命令:net stop ECService

卸载服务命令:JavaService -uninstall ERPService

转载于:https://my.oschina.net/u/3411429/blog/1589603

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值