2012-08-07 48 views
4

首先,如果已经有像我这样的问题在stackoverflow,对不起,但我没有设法找到它。其实我不知道我可以用什么标签来寻找我需要的解决方案。简单的基于Java的工作流程管理器/数据工作流程,具有启动分机的能力。应用程序,电话网络服务等

基本上,我需要一个工具/软件,它可以在整个过程中使用多个工具/操作来管理数据(对象)流。当然,现有的BPM /工作流平台工具之一可能可以做到这一点,但它们似乎对我的要求来说太复杂了。

我有一个使用JPA/Hibernate构建的“静态”数据模型。然后,我需要更改该静态模型,以便在其上使用不同的处理函数。该功能可能是一些Java类,Web服务或外部应用程序(支持批处理模式)。之后,我需要捕捉这些函数的输出并进行一些可视化,绘制一些图表等。 我可以假设所有这些处理函数都可以访问静态模型,并且可以将其更改为特定的模型,因此不需要将输入传递给他们。另一方面,它们的输出应该被主要的“工作流程管理器”所捕获。

还有一件事,整个过程应该在没有任何用户交互的情况下自动运行(也许它将在未来发生变化,但现在看和现在)。在过程开始之前,管理员应该定义使用哪个“处理功能”,就是这样。 另一件事......如果整个过程在数据库状态发生变化时触发,但最重要的不是关键,我可以通过调用Web服务来启动它。

问题是:我应该使用现有的BPM/Workflow工具之一,如jBPM或Activiti,自己写一个简单的“工作流程管理器”,或者使用一个比jBPM/Activiti更简单的现有工具有没有?)。当然,我更喜欢最简单的方法...

非常感谢任何反馈意见。

+0

您应该使用工作流程工具。我个人推荐Activiti。 – 2012-08-07 10:06:20

回答

9

Apache Camel是一个开源的集成框架,它可以帮助你解决这个问题。

您可以使用Apache Camel构建您自己的简单工作流管理器,其中每个流程都实现Processor。您的数据可以通过处理器使用骆驼Exchange。查看骆驼examples了解更多信息。请致电here

您可以动态地将处理器添加到骆驼RouteBuilder中,使用Quartz Scheduler等进行安排,这或多或少都能满足您的所有需求。

这里是很好的介绍,骆驼http://www.kai-waehner.de/blog/2012/05/04/apache-camel-tutorial-introduction/

使用骆驼的简单实现工作流管理的:

WorkflowManager.java

import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.impl.DefaultCamelContext; 

public class WorkflowManager { 

    DefaultCamelContext camelContext; 

    public WorkflowManager() { 
     camelContext = new DefaultCamelContext(); 
     RouteBuilder routeBuilder = new RouteBuilder() { 

      @Override 
      public void configure() throws Exception { 
       from("timer:schedule?period=1s&daemon=true").process(new ProcessOne()).process(new ProcessTwo()); 
      } 
     }; 
     try { 
      camelContext.addRoutes(routeBuilder); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void start() throws Exception { 
     camelContext.start(); 
    } 

    public void stop() throws Exception { 
     camelContext.stop(); 
    } 

    public static void main(String[] args) { 
     WorkflowManager workflowManager = new WorkflowManager(); 
     try { 
      workflowManager.start(); 
      while(true) { 

      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

ProcessOne。java的

import org.apache.camel.Exchange; 
import org.apache.camel.Processor; 

public class ProcessOne implements Processor { 
    @Override 
    public void process(Exchange exchange) throws Exception { 
     System.out.println("In ProcessOne"); 
    } 
} 

ProcessTwo.java

import org.apache.camel.Exchange; 
import org.apache.camel.Processor; 

public class ProcessTwo implements Processor { 
    @Override 
    public void process(Exchange exchange) throws Exception { 
     System.out.println("In ProcessTwo"); 
    } 
} 

我用骆驼版本2.9.0编译这段代码。请注意,我在main方法中使用了一个无限循环来使主线程保持活动状态。

此代码将运行ProcessOne和ProcessTwo的路由,周期为1秒。您可以从(...)方法中查看添加处理器到路由构建器的时间段。因此,这条路线将重复运行。另外,我不想传输任何数据。您可以在每个处理器的处理方法中使用交换来流动数据。

输出将是:

In ProcessOne 

In ProcessTwo 

In ProcessOne 

In ProcessTwo 

您可以使用骆驼的组件,让您的WorkflowManager强劲。

+0

谢谢你的回复。然而,Apache Camel看起来不错,你知道使用Camel API(xml,java,blocks或其他)运行外部应用程序的简单方法吗?我只想使用显式的Runtime.getRuntime()。exec()方法。 – visionary 2012-08-07 12:38:40

+0

还有一件事(对于双后,抱歉,但我不能编辑以前的评论..)。流程二总是等待流程一的结束?在第一个实际结束之前没有办法开始执行第二个过程(我的意思是,我想要的,只是一个简单的顺序处理)。 – visionary 2012-08-07 12:46:45