4

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

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

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

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

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

非常感谢您的任何反馈。

4

1 回答 1

9

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

您可以使用Apache Camel构建自己的简单工作流管理器,其中每个流程都实现Processor。您的数据可以通过使用 camel Exchange的处理器传递。查看骆驼示例以获取更多信息。

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

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

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

使用 Camel 的 Workflow Manager 的简单实现:

工作流管理器.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");
    }
}

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

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

输出将是:

In ProcessOne

In ProcessTwo

In ProcessOne

In ProcessTwo

您可以使用骆驼组件来使您的 WorkflowManager 健壮。

于 2012-08-07T09:40:08.023 回答