3

根据 jBPM 页面 [1] 上的白皮书,jBMP 可以轻松地在独立应用程序中使用。但是,我找不到有关如何实际执行此操作的任何信息。我想创建一个简单的 java 应用程序(可能使用 SWT),它使用 jBPM 显示一个流程。然后,用户应该能够通过修改 jBPM 图来修改应用程序的行为。为此,我还必须集成一些我认为的 Eclipse 组件。有什么想法吗?

[1] http://www.jboss.com/pdf/jbpm_whitepaper.pdf

4

2 回答 2

2

在开始之前,您可能还想看看Roamflow是否满足您的需求,因为它似乎是一个独立的基于 jBPM Eclipse/RCP 的查看器/编辑器。

否则,您应该知道如何构建 eclipse 插件,或者获取我发现对大多数 eclipse 插件/SWT 开发需求有用的书,“Eclipse Building Commercial-Quality Plug-ins”,由 eclipse 和 Addison-Wesley 出版。另外,我不会坐下来给你写一个测试应用程序,无论如何你需要了解基础知识。

  1. 通过独立它们意味着在具有正确库的任何旧 JVM 中运行。它确实需要部署在 J2EE 容器中,通过 Web 等进行查看。

  2. 查看 jBPM eclipse 插件的源代码,因为它具有您正在寻找的功能,对吗?基于它的 SWT/eclipse 显示 jBPM。这包括检查 jBPM 可能安装的扩展点,您可以使用这些扩展点快速构建 eclipse 插件。例如:jBPM 编辑器代码,这里. 或者如何序列化,在这里,重用。

  3. 这是关键的 SWT/绘图,关键线是将 jBPM 转换为 SWT 事物“g = new SWTGraphics(gc);”。这似乎从 jBPM 模型生成图像。

    protected void writeImage() {           
    SWTGraphics g = null;
    GC gc = null;
    Image image = null;
    LayerManager lm = (LayerManager)getGraphicalViewer().getEditPartRegistry().get(LayerManager.ID);
    IFigure figure = lm.getLayer(LayerConstants.PRINTABLE_LAYERS);
    
    try {
        Rectangle r = figure.getBounds();
        image = new Image(Display.getDefault(), r.width, r.height);
        gc = new GC(image);
        g = new SWTGraphics(gc);
        g.translate(r.x * -1, r.y * -1);
        figure.paint(g);
        ImageLoader imageLoader = new ImageLoader();
        imageLoader.data = new ImageData[] {image.getImageData()};
        imageLoader.save(getImageSavePath(), SWT.IMAGE_JPEG);
        refreshProcessFolder();
    
    } finally {
        //SNIP
    }
    }
    
  4. 从插件的plugin.xml 中学习,本例中src 位于此处。例如,这是 jBPM 将其视图添加到 Eclipse:

    point="org.eclipse.ui.views" ... view class="org.jboss.tools.flow.jpdl4.view.DetailsView"...
    

    可能是您想要复制的一个扩展,因为它似乎支持“视图”。这将帮助您了解他们如何构建基于 Eclipse 的应用程序的各个部分。如果您在 JBPM 插件上安装了开发人员版本,您可以在工作空间中搜索这些类并查看源代码。

  5. 决定是否需要拆分作为 GMF(图形建模框架)构建的应用程序部分,例如模型、视图/图表的行为以及不同的编辑/绘图部分。除非你也有,否则不要搞砸这个。但是,了解 GMF 插件或查看示例将帮助您了解您可能需要使用哪些 jBPM 插件,尤其是在需要编辑时。

  6. 将这些片段滚动到一个插件中,记住重用您可以从 jBPM 项目中获得的片段(插件/插件)。可以确保将您的 Eclipse 插件构建为 RCP 或富客户端......(注意 jBPM 目前没有 RCP,每个帖子),以便它可以作为 Eclipse 独立应用程序,以便更容易部署给没有 Eclipse 工具知识的人.

让我知道这是否能让你走上正确的道路。

于 2009-06-07T19:50:46.843 回答
2

是的,可以完全独立地运行 jbpm 流程引擎,作为一个简单的 java 程序。不需要 J2EE 容器。至少 jbpm 4.4 是这种情况

就代码要求而言,

  1. 设置你的 jbpm 数据库模式
  2. 将以下 jar 从 jbpm 分发库添加到应用程序类路径:antlr-runtime.jar antlr.jar dom4j.jar hibernate-core.jar javassist.jar jbpm.jar slf4j-api.jar slf4j-jdk14.jar slf4j-log4j12。 jar commons-collections.jar jta.jar juel-api.jar juel-engine.jar juel-impl.jar mail.jar 以及您正在使用的数据库的必要 JDBC 驱动程序。
  3. 你的独立类看起来像这样:

    package test.ayusman;

    import java.util.HashMap;
    import java.util.Map;

    import org.jbpm.api.Configuration;
    import org.jbpm.api.ExecutionService;
    import org.jbpm.api.ProcessEngine;
    import org.jbpm.api.ProcessInstance;
    import org.jbpm.api.RepositoryService;

    public class ProcessDeployer {

        // Create a process engine that can be used for all other work...
        // ProcessEngine is starting point for all other application.
        private static ProcessEngine jbpmProcessEngine = new Configuration()
                .setResource("jbpm.cfg.xml").buildProcessEngine();
        // private static Logger logger = Logger.getLogger(JBPMDao.class);

        private static RepositoryService repositoryService = null;
        private static ExecutionService executionService = null;
        private static ProcessInstance pi = null;
        private static String processInstanceState;
        private static String processInstanceId;


        public static void main(String[] args) {
            try {

                ProcessDeployer ejm = new ProcessDeployer();

                //Start the process...
                ejm.startProcess();

                //Analyze process... just a small fancy method
                ejm.analyzeProcess();


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

        }// End of main()


        void startProcess() throws Exception
        {

            repositoryService = jbpmProcessEngine.getRepositoryService();
            executionService =  jbpmProcessEngine.getExecutionService();

            //NOTE: The example assumes that the process definition file name is: your_process.jpdl.xml
            processInstanceId = repositoryService.createDeployment().addResourceFromClasspath("your_process.jpdl.xml").deploy();             

            //NOTE: The jpdl file has key name as "Java"
            pi = executionService.startProcessInstanceByKey("Java");  

            System.out.println("Obtained processInstanceId is: "+processInstanceId);             
        }

        void analyzeProcess() throws Exception
        {
            processInstanceState = pi.getState();
            System.out.println("processInstanceState is: "+processInstanceState);
            System.out.println("processInstanceId is: "+processInstanceId);
        }


    }// End of class ProcessDeployer
  1. 请注意,当您在 SWT 应用程序中运行流程引擎时,流程引擎与 SWT 驻留在同一个 JVM 上,因此请确保您分配了足够的空间。

希望这可以帮助 :-)

于 2011-05-07T08:52:55.377 回答