题
根据 jBPM 页面 [1] 上的白皮书,jBMP 可以轻松地在独立应用程序中使用。但是我找不到任何有关如何实际执行此操作的信息。我想创建一个简单的 java 应用程序(可能使用 SWT),它使用 jBPM 显示流程。然后,用户应该能够通过修改 jBPM 图来修改应用程序的行为。为此,我还必须集成一些我认为的 Eclipse 组件。有什么想法吗?
解决方案
在开始之前,您可能还想看看是否 漫游流 满足您的需求,因为它似乎是一个独立的基于 jBPM Eclipse/RCP 的查看器/编辑器。
否则,您应该知道如何构建 Eclipse 插件,或者获取我发现对大多数 Eclipse 插件/SWT 开发需求有用的书“Eclipse Building Commercial-Quality Plug-ins”,由 eclipse 和 Addison-Wesley 出版。另外,我不会坐下来为您编写一个测试应用程序,无论如何您都需要了解基础知识。
所谓独立,是指可以在任何具有正确库的旧 JVM 中运行。它确实需要部署在J2EE容器中,通过Web查看等。
查看 jBPM eclipse 插件的源代码,因为它具有您正在寻找的功能,对吗?基于它的 SWT/eclipse 显示 jBPM。这包括检查 jBPM 可能安装的扩展点,您可以使用它们来快速构建 eclipse 插件。例如:jBPM 编辑器代码, 这里. 。或者如何序列化, 这里, ,重复使用。
这是关键的 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 } }
借鉴插件的plugin.xml,src位于 这里 在这种情况下。例如,以下是将其视图添加到 Eclipse 的 jBPM:
point="org.eclipse.ui.views" ... view class="org.jboss.tools.flow.jpdl4.view.DetailsView"...
这 可能是您想要复制的一个扩展,因为它似乎支持“视图”。这将帮助您了解他们如何构建基于 Eclipse 的应用程序的各个部分。如果您在 JBPM 插件上安装了开发人员版本,则可以在工作空间中搜索这些类并查看源代码。
决定是否需要分解作为 GMF(图形建模框架)内容构建的应用程序部分,例如模型、视图/图表的行为以及不同的编辑/绘图部分。除非你也有,否则不要搞乱这个。然而,了解 GMF 插件或查看示例将帮助您了解可能需要使用哪些 jBPM 插件,特别是在需要编辑的情况下。
将各个部分整合到一个插件中,记住重用 jBPM 项目中可以使用的部分(插件/插件)。可以肯定将您的 eclipse 插件构建为 RCP 或 Rich Client...(注意 jBPM 目前没有 RCP,根据 邮政)这样它就可以作为一个 eclipse 独立应用程序,以便于没有 eclipse 工具知识的人更容易部署。
让我知道这是否能让您走上正确的道路。
其他提示
是的,可以完全独立地运行 jbpm 流程引擎,作为一个简单的 java 程序。不需要 J2EE 容器。至少jbpm 4.4是这样
就代码要求而言,
- 设置你的 jbpm 数据库模式
- 将 jbpm 分发库中的以下 jar 添加到应用程序类路径:antlr-runtime.jar antlr.jar dom4j.jar hibernate-core.jar javassist.jar jbpm.jar slf4j-api.jar slf4j-jdk14.jar slf4j-log4j-log4j12.jar colles.jar commons.jar commons collections .on juel-engine.jar juel-impl.jar mail.jar和您使用的DB的必要JDBC驱动程序。
- 你的独立类如下所示:
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
- 请注意,当您在 SWT 应用程序中运行流程引擎时,流程引擎与 SWT 驻留在同一 JVM 上,因此请确保分配足够的空间。
希望这可以帮助 :-)