2009-06-05 206 views
3

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

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

回答

2

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

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

  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或富客户端来构建......(注意,jBPM目前没有RCP,根据post),因此它可以作为eclipse独立应用程序,以便更轻松地部署给没有eclipse工具知识的人员。

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

+0

哇谢谢:)现在我已经阅读并代码.. – Nils 2009-06-08 06:57:31

2

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

至于规范要求去,

  1. 设置你的jBPM数据库模式
  2. 从jBPM发布库的应用程序的classpath中添加以下jar文件: ANTLR-runtime.jar antlr.jar dom4j.jar 休眠-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应用程序中运行的流程引擎,流程引擎驻留在同一JVM中SWT,所以请确保您分配足够的空间。

希望这有助于:-)