技术标签: java 定时调用存储过程
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 : [email protected]
* @date 2017年12月12日 上午10:24:11
*/
public class KettleUtil {
/**
*
* @Description: TODO
* @param @param transFileName
* @param @throws Exception
* @return void
* @throws
* @Author: Pru
* @Email : [email protected]
* @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 : [email protected]
* @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 : [email protected]
* @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
文章浏览阅读194次。这篇文章会介绍一些RabbitMQ的基本概念和使用注意,避免初学者掉入使用不规范的坑里。首先看一张大图声明:图片摘自https://mp.weixin.qq.com/s/OABseRR0BnbK9svIPyLKXw上图介绍了RabbitMQ消息队列的基本流程,下面说一下基本概念:Connection: TCP协议连接,不管是消费者还是生产者都需要连接到RabbitMQ服务上。Channel: 频道,一个双向数据流通道,它是建立在Connection真是TCP连接下的虚拟连接(因为TC_mq deliver
文章浏览阅读1.2k次。Ubuntu Terminator 分屏_terminator终端分隔线
文章浏览阅读314次。“软件工程师阅读教科书作为参考时不会记住所有的东西,但是要知道如何快速查找重·要的知识点。”为了能够快速查找和使用功能,使我们在进行机器学习模型时能够达到一定流程化。我创建了这个pandas函数的备忘单。这不是一个全面的列表,但包含了我在构建机器学习模型中最常用的函数。让我们开始吧!本附注的结构:导入数据导出数据创建测试对象查看/检查数据选择查询数据清理筛选、排序和分组统计数据首先,我们...
文章浏览阅读296次。redis基础知识汇总缓存的基本知识缓存的思想缓存的优势与代价缓存读写的模式缓存分类及常用缓存缓存的七大经典问题一、redis 基础知识1. 什么是Redis?2. redis的优缺点?redis为什么是单线程的?redis比memcached的优势在哪里?以及两者的区别?redis的基本数据结构redis底层的数据结构redisObject字符串对象Sds列表对象ziplistquicklist哈希对象dict集合对象有序集合对象hyperloglogGEObitmapRedis的协议模式设计原则两种特殊
文章浏览阅读233次。微信小程序云开发的一些简单功能,上传图片下载和上传数据读取数据(可以根据授权机制读取openid来私有相册).地址:https://github.com/18379259382/pictureUploading参考文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html...
文章浏览阅读1.5w次,点赞7次,收藏57次。图片没法直接COPY过来,请下载我上传的PDF SPAD SiPM 激光雷达sensor 技术简介1 Photon Detection with SPAD and SiPMSPAD和SiPM的光子检测1.1. Photon Absorption in Silicon 光子在硅材料中被吸收。当光子穿过硅时,他有可能被吸收并把能量传递给硅中的束缚电子。这使得束缚电子从价带移动到导带,形..._spad sensor
文章浏览阅读1k次。计数器是一种收集Job统计的有效手段,用于质量控制或应用级统计。计数器的应用使得获取统计数据比使用日志文件获取数据更加容易。1).内置计数器Hadoop的内置计数器用来描述Job的各项指标,例如已处理的_properties的用法hadoop
文章浏览阅读360次。在这里,就把一次闹钟跟重复闹钟都写在一起吧,他们的区别不大。_android的闹钟
文章浏览阅读1.7k次。QT实验分析教程 Hello QT --- 编译,Log调试,断点调试,条件断点(2) QT是一套跨平台的GUI开发库QT是一套C++集成开发环境 第一个QT程序:Main.cpp#include <QApplication>#include <QMainWindow>#include <QPushButton&g..._qt 条件断点
文章浏览阅读1.3k次。argument list too long有时候会出现这种问题,比如rm, cp, ls -l, mv等。 可以使用-exec参数,链接在这里 find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了。看例子:find ./ -name “*.txt” -exec ls -l “{}” \; 查找......_小班得瑞
文章浏览阅读2.2k次。在Properties中添加Name:archetypeCatalog和Value:internal,如下图那样_idea maven web很慢
文章浏览阅读246次。Ubuntu系统---系统驱动丢失、Kernel内核卸载、禁止更新 一早开机发现,ubuntu字体异常,字体很大,直接反应是驱动坏了。一查,确实丢失英伟达驱动,为什么呢?莫名的消失。想知道:1.英伟达驱动丢失的原因?2.如何解决和避免? 上次,英伟达驱动出现问题,是循环在登陆界面。这次,英伟达驱动丢失,是内核升级了,不知道何时自动升级了,导致内核和驱动不兼容。 摘至网络..._e: amd64-microcode: unsupported kernel version! e: intel-microcode: unsuppor