简单的基于java的工作流管理器/数据工作流,能够启动外部应用程序、调用web服务等

简单的基于java的工作流管理器/数据工作流,能够启动外部应用程序、调用web服务等,java,workflow,dataflow,data-processing,Java,Workflow,Dataflow,Data Processing,首先,如果stackoverflow上已经有像我这样的问题,很抱歉,但我还没有找到它。实际上,我不知道我可以用什么标签来搜索我需要的解决方案 基本上,我需要一个工具/软件,可以在整个过程中使用多个工具/操作来管理数据(对象)流。当然,现有的BPM/workflow平台工具之一可能可以做到这一点,但它们对于我的需求来说似乎太复杂了 我有一个用JPA/Hibernate构建的“静态”数据模型。然后我需要改变这个静态模型,以便在上面使用不同的处理函数。该函数可以是一些java类、web服务或外部应用程

首先,如果stackoverflow上已经有像我这样的问题,很抱歉,但我还没有找到它。实际上,我不知道我可以用什么标签来搜索我需要的解决方案

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

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

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

问题是:我应该使用一个现有的BPM/工作流工具,如jBPM或Activiti,自己编写一个简单的“工作流管理器”,还是使用一个比jBPM/Activiti简单得多的现有工具(有吗?)。当然我更喜欢最简单的方法


非常感谢您的反馈。

Apache Camel是一个开源集成框架,它将在这方面帮助您

您可以使用来构建自己的简单工作流管理器,每个流程都在其中实现。您的数据可以使用camel通过处理器传递。查看camel了解更多信息

有关如何编写自定义处理器的信息,请阅读

您可以动态地将处理器添加到Camel RouteBuilder,使用等来调度它,这或多或少会满足您的所有需求

这里是骆驼的好介绍

使用Camel的工作流管理器的简单实现:

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();
        }
    }
}
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");
    }
}
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");
    }
}
ProcessOne.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();
        }
    }
}
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");
    }
}
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");
    }
}
ProcessTwo.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();
        }
    }
}
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");
    }
}
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");
    }
}
我使用Camel版本2.9.0来编译这段代码。请注意,我在main方法中使用了一个无限循环来保持主线程的活动

此代码将运行一个包含ProcessOne和ProcessTwo的路由,周期为1秒。您可以在from(…)方法中看到一段时间,我在其中向route builder添加处理器。因此,这条路线将重复运行。此外,我也没有试图传递任何数据。您可以在每个处理器的处理方法中使用exchange来传递数据

输出将是:

In ProcessOne

In ProcessTwo

In ProcessOne

In ProcessTwo

您可以使用camel组件使WorkflowManager更加健壮。

您应该使用工作流工具。我个人推荐Activiti。感谢您的回复。ApacheCamel看起来不错,但是,您知道使用CamelAPI(xml、java、blocks或其他)运行外部应用程序的简单方法吗?我只想避免使用显式的Runtime.getRuntime().exec()方法。还有一件事(很抱歉重复发布,但我无法编辑前面的注释..)。进程2总是等待进程1的结束?在第一个进程实际结束之前,无法开始执行进程2(我的意思是,我希望这样,只是一个简单的顺序处理)。