带SWT的jBPM独立应用程序

时间:2009-06-05 07:54:05

标签: java eclipse jbpm

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

  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位于here。例如,这里是jBPM将它的视图添加到eclipse:

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

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

  5. 决定是否需要破解构建为GMF(图形化建模框架)内容的应用程序部分,例如模型,视图/图表的行为以及不同的编辑/绘图部分。除非你有,否则不要乱用它。但是,了解GMF插件或查看示例将有助于您了解可能需要使用的jBPM插件,尤其是在需要编辑时。

  6. 将这些碎片滚动到一个插件中,记住要重复使用jBPM项目中的各个部分(插件/插件)。可以确保将您的eclipse插件构建为RCP或Rich Client ...(注意,jBPM当前没有RCP,每post),因此它可以作为eclipse独立应用程序,以便更轻松地部署到那些不能拥有日食工具知识。

  7. 如果这让你走上正确的道路,请告诉我。

答案 1 :(得分:2)

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

就代码要求而言,

  1. 设置您的jbpm数据库架构
  2. 将以下jars从jbpm分发库添加到应用程序类路径: ANTLR-runtime.jar antlr.jar dom4j.jar 冬眠-core.jar添加 javassist.jar jbpm.jar SLF4J-api.jar文件 SLF4J-jdk14.jar SLF4J-log4j12.jar 公地collections.jar jta.jar JUEL-api.jar文件 JUEL-engine.jar JUEL-impl.jar中 的mail.jar 和您正在使用的数据库的必要JDBC驱动程序。
  3. ,您的独立课程如下所示:
  4. 
        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上,因此请确保分配足够的空间。
    2. 希望这会有所帮助: - )