如何按计划和按需执行Java任务?

时间:2015-07-16 22:55:58

标签: java sql-server csv tomcat jenkins

我的任务是将一个大的mssql表转储到一个csv文件中,以便在其他地方上传。该任务需要每晚(或任何计划的)运行,并且还应该按需执行(从网页)。 csv转换必须在Java中完成。

这是我从未实施过的,但这似乎是一个非常普遍的需求。从我的谷歌研究中,我想出了两个选择。但我不知道这些是否存在明显的缺陷,或者是否存在我不知道的明显(和优越)实现选项。所以我真的可以使用一些知情的反馈/建议来解决这个问题。

  1. 在Web服务容器中执行我的Java应用程序,例如Apache Tomcat。应用程序只需运行并按照任何计划执行业务逻辑,Tomcat可以从网页轻松访问它。但这似乎有点过分,无法设置和维护Tomcat安装。

  2. 将我的Java程序打包为jar,并设置Jenkins作业(我可以访问Jenkins服务器安装)以按照任何计划执行主类。并根据需要创建Jenkins作业(在php或其他东西中)以执行按需执行。这似乎是一个非常干净和简单的选择,是否有任何明显的缺陷我不在?

  3. 这项工作有很多工具,不知道如何选择合适的工具。

    此外,我们非常感谢任何关于如何以安全和高效的方式将表转换为csv的一般建议。

2 个答案:

答案 0 :(得分:1)

处理按计划运行作业的最常用方法是cron

至于通过网页访问它或许它可以作为web服务运行,使用一些休息或soap api。这个web服务基本上会运行你的java逻辑并将csv作为响应传递或在服务器上的文件系统上生成它。

至于转储数据 - 应该可以直接从mysql导出到csv:Dump a mysql database to a plaintext (CSV) backup from the command line

如果没有要求在Java中执行此操作,那么我建议使用提交按钮调用mysqldump命令的简单网页。这可能是一个php脚本,它可以作为系统调用的包装器,将mysqldump运行到csv并将其转储到http服务器上的某个位置。

答案 1 :(得分:0)

我之前做过类似的事情,但我受到的限制是:

  1. 调用由第三方进行(使用Control-M - 其他调度工具可用,包括cron)。

  2. 目标是MySQL的ETL。

  3. 该平台本身就是Linux,(显然)/ MSSQLSERVER端的Windows。

  4. 为了展示这项服务,我们使用了Apache和一个简单的三重PHP脚本,这些脚本采用了名词(数据库模式名称)&排队,杀死和查看相关摘录的作业状态的动词(开始/停止/状态)。

    通过将任务推送到由bash编写的简单(可能的cronnable)循环监视的队列来调用 start 。这会调用isql来转储每个模式的表。

    我们需要动态发现模式和表结构,所以我们使用类似......

    的东西
    SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME like'<Schema>.%';
    

    我们需要过滤掉与简单模式匹配的临时表 - 我想我使用了sed。如果您不担心重新导入到不同的RDBMS,我们可以跳过重建create table语句的步骤(我们没有找到等同于 show create table 的MSSQLSERVER并执行其他操作)。 / p>

    要转储表,我们只需调用 isql 客户端。如果您使用的是Windows,则可以使用native MSSQLSERVER client

    echo "select * from $table" | isql -b -q -d\|  $schema $username $p/w > /tmp/$table.csv
    

    这个转储使用管道(|)而不是逗号,因为我们在自由文本数据中有很多逗号。它还引用封装的字符串字段。我想我也编辑了isql的源代码(因为它是开源的,并且很棒的工作)来逃避字符串类型中的嵌入式引号(我不得不为我们的Oracle源代码执行此操作),以便更轻松地加载MySQL。 / p>

    stop 类似于一个作业会调用一些进程杀戮(通过进程树找到,我确定可以使用更优雅的方法) - 它需要是野蛮而直接的因为它的调用是在与网络日发生冲突的情况下进行的。如果我们错过了一天的提取物,那么它被认为不如影响工作日的开始那么重要。该脚本还整理了状态并将提取标记为下游服务的错误,因此他们忽略了它并继续上一次卸载。

    状态为整个服务的客户提供了便利。我们学到的是你应该准备他们发出开始,然后在状态上进行忙碌循环(每秒20和200之间!)直到十五分钟到三个小时稍后当状态返回空闲,然后客户端发出停止(确保在空闲时 停止 < / em> extract)。我们只是在状态服务中添加了一个 sleep ,因为很难说服客户改变他们的逻辑。

    这是一个中央政府执法机构,上面的客户是我们的外包IT服务提供商之一。这个生态系统(正在!)运行着大约六个来源,包括Oracle,MSSQLSERVER和SESAM。