jBPM 4.0: basic taskform tutorial (what’s new – part 4)

Introduction

The jBPM framework is often used in an embedded way, where the BPM models are an integral part of the application architecture. Often, this means the creation of custom screens which interact with the BPM engine to communicate with end-users. But there is a whole spectrum of applications which don’t need a full-blown architecture to transform a real-life business process into executable computer code (like intranet webapps or a complex algorithm that needs to be executed on certain points in time).

In this post, I’ll show you how easy it is to assemble such a webapplication, using jBPM 4.0 taskforms and the jBPM console. So no integration with custom code today. We’ll start with a simple business process and enhance it with taskforms to ‘generate’ ourselves a basic but usable webapp.

Important: a taskform example is shipped with the jBPM 4.0 distribution. However, a code change just before the release invalidated the example which means that the official distribution doesn’t show how task forms should be used. The example in this post will replace the taskform example in the 4.1 release. So up till then, this is the only ‘semi-official’ taskform example 😉

Also note that the shipped taskform integration is a first release. It doesn’t look very sexy for the moment, but we’ll definitely put some love in it in one of the next releases!

Prerequisites

You should have run the jBPM 4.0 ‘demo.setup’. This means that a working Eclipse 3.5 with GPD and a JBoss 5.0.0 AS server with the jBPM console is installed.

If not, please follow the documentation in the jBPM user guide.

You also should have a mail server running on port 25. The quickest way is to use my fake email server (based on Dumbster). Just run the jar as root (since you need to bind on a port lower than 1024):

Business process explained

In this tutorial, we’ll implement the same business process as in the official taskform example. The process starts when a vacation requestform is filled in. The manager will then either reject or accept the request and both outcomes trigger the sending of an e-mail to the employee that filled in the first form.

It is easy to see that this is an intranet application that any company can use, but it is significantly simplified for tutorial purposes.

The end result will look like this:

The real deal

Download the source of this process. This is a Maven2 based project. Just unzip it and import it into Eclipse (using m2Eclipse). The XML version of the process above looks like this:


<process name="taskformExample" xmlns="http://jbpm.org/4.0/jpdl">

<start form="be/jorambarrez/jbpm4/demo/taskform/request_vacation.ftl" name="start">
<transition to="verify_request"/>
</start>

<task candidate-users="peter,mary" form="be/jorambarrez/jbpm4/demo/taskform/verify_request.ftl" name="verify_request">
<transition name="accept" to="Send acceptance e-mail"/>
<transition name="reject" to="Send rejection e-mail"/>
</task>

<mail name="Send rejection e-mail">
<to addresses="${employee_email}"/>
<subject>Your vacation request has been rejected</subject>
<text>Your vacation request for ${number_of_days} has been rejected. Reason: ${reason}</text>
<transition to="vacation_rejected"/>
</mail>

<mail  name="Send acceptance e-mail">
<to addresses="${employee_email}"/>
<subject>Your vacation request has been accepted</subject>
<text>Success: your vacation request for ${number_of_days} has been accepted.</text>
<transition to="vacation_accepted"/>
</mail>

<end name="vacation_rejected"/>

<end name="vacation_accepted"/>

</process>

Note that the process is started using the start form request_vacation.ftl. This is a simple HTML freemarker template which looks like this:

<html>
<body>

<form action="${form.action}" method="POST" enctype="multipart/form-data">

<h3>How many days would you like to go on vacation?</h3>
<select name="number_of_days">
<option value="3">3 days</option>
<option value="5">5 days</option>
<option value="10">10 days</option>
</select>

<br/>
<br/>

Your name: <input type="text" name="employee_name" /><br/>
Your email address: <input type="text" name="employee_email" /><br/>

<br/>
<br/>

<input type="submit" name="Done"/>

</form>
</body>
</html>

Every value of a form input (ie select, text input, etc.) will be added to the process instance as a process variable. In this example, the values number_of_days, employee_name and employee_email will be stored into the process instance as a process variable. This also works the other way around. In the second node, the manager must approve the vacation request, using the verify_request.ftl form. All the process variables stored in the process instance are available in the form (eg. number_of_days)

<form action="${form.action}" method="POST" enctype="multipart/form-data">

<h3>Your employee, ${employee_name} would like to go on vacation</h3>
Number of days: ${number_of_days}<br/>

<hr>

In case you reject, please provide a reason:<br/>
<input type="textarea" name="reason"/><br/>

<#list outcome.values as transition>
<input type="submit" name="outcome" value="${transition}">
</#list>

</form>

If you take a look at the process xml, you’ll see that these variable expressions are also usable for the e-mail that is sent afterwards:

<mail name="Send acceptance e-mail">
<to addresses="${employee_email}"/>
<subject>Your vacation request has been accepted</subject>
<text>Success: your vacation request for ${number_of_days}has been accepted.</text>
<transition to="vacation_accepted"/>
</mail>

Running the example

The example process now needs to be deployed to the database that is used by the jBPM console. An advanced way of deploying this process is shown in the example project, where the process is deployed through the remote EJB command service which is installed on the JBoss sever during the demo.setup. Typically, you’ll use the standard jBPM service API (ie the repositoryService and the executionService) instead of the command service directly. So this code is meant for power-users only 😉

DeploymentImpl deployment = createDeployment();
RemoteCommandExecutor commandExecutor = retrieveCommandExecutor();

DeployCmd deployCmd = new DeployCmd(deployment);
commandExecutor.execute(deployCmd);

Do note that during the creation of the deployment, you’ll need to add all the forms to the deployment. We’re looking into ways of simplifying this in a next release.

deployment.addResourceFromClasspath("be/jorambarrez/jbpm4/demo/taskform/process.jpdl.xml");
deployment.addResourceFromClasspath("be/jorambarrez/jbpm4/demo/taskform/process.png");
deployment.addResourceFromClasspath("be/jorambarrez/jbpm4/demo/taskform/verify_request.ftl");
deployment.addResourceFromClasspath("be/jorambarrez/jbpm4/demo/taskform/request_vacation.ftl");

Run the Main.java class and go to http://localhost:8080/jbpm-console. Log in as alex/password. Go to the Processes > Process Definitions > Definition List view. Our process will be added to the list of definitions (last one in the list):

Now, select the taskformExample-1 process. Click on the Process Instances tab and press Start. The start form will be displayed. Only when the form is submitted, a process instance will be created.

Click on Submit Query. Now log out the console and log in as Peter. If you’ve paid attention, you’ve seen that the Verify Request task can be done be Peter or Mary. Log in a Peter (with password =  ‘password’) and go to the Tasks > Task Management > Task List view.

The task is currently unassigned (but Peter and Mary are candidates for the tasks). Click the Claim button to move this tasks to Peter’s personal tasks. Go to the Personal Tasks tab and click View. The second task form is shown:

Clicking accept or reject will cause the task to be completed. The process instance will move on and reach one of the mail nodes. The mail activity will be triggered, the mail server will receive the mail and the process instance ends and is removed from the database.

And that’s it. Your very first taskform-enabled business process! Any feedback on the taskforms or console is appreciated!

25 Comments

  1. Heiko Braun July 21, 2009

    Thanks Joram for providing a comprehensive example.

  2. Christoph July 29, 2009

    Hi, realy nice example and it works perfectly. But i dont get why the mail can be read by the “fakemail” server on port 25.. are all mails send to this port by default ? Will this behavior change if i configure a extern mail-server ?

    thx,
    greetz

  3. Joram Barrez July 29, 2009

    The jBPM engine that is configured on the GWT console is configured to send mails to port 25.

    You can easily change this by changing the jBPM config: see http://docs.jboss.com/jbpm/v4.0/devguide/html_single/#mailservers

  4. Christoph July 29, 2009

    Well an additional question: is it possible to get the processengine services the same way you got the CommandExecutor ? the dev guide shows some code like:

    InitialContext ctx = new InitialContext();
    this.processEngine =(ProcessEngine)ctx.lookup(“java:/ProcessEngine”);

    but i realy fail in let this run on JBoss… have no expierience with EJBs or Servlets 🙁

  5. Joram Barrez July 29, 2009

    Christoph,

    That will only work when you are inside JBoss (eg a WAR deployed on JBoss). The ProcessEngine is not a remote component (servlet or EJB) such as the CommandExecutor.

    It is far easier just to point your Hibernate config to the same database as the console (see jbpm folder in the deploy folder of JBoss) and to do new Configuration().buildProcessEngine();

  6. Christoph July 29, 2009

    Hey,
    thx ! You mean i should use a custom configuration like:

    ProcessEngine processEngine = new Configuration()
    .setResource(“my-own-configuration-file.xml”)
    .buildProcessEngine();

    And specify in there, that the DB of JBPM (inside the JBOSS) should be used ? I opened the standard “hibernate.cfg.xml” but realy cant find any infos on what can be configured.. 🙁

    i would be deeply grateful if you could help me out with this, im under hard pressure because of my bachelor thesis and afraid to fail 🙁

  7. Joram Barrez July 29, 2009

    @Christoph
    Yes, this means using your own configuration and your own hibernate config.

    Check http://shekharv.blogspot.com/2009/07/sample-hibernate-and-jbpm-application.html for a good example

    PS: You’re lucky today that I reply this quick, but on the forum http://www.jboss.org/index.html?module=bb&op=viewforum&f=217 you’ll probably have more quicker answers.

  8. Christoph July 29, 2009

    thanks a lot ! =)

  9. Sarat August 27, 2009

    Thank you Joram. Very nice post.

  10. Sauarbh August 31, 2009

    After Starting the process from JBPM consile I am getting following exception.

    org.jboss.resteasy.spi.UnhandledException: java.lang.RuntimeException: No UI associated with PROCESS taskformExample-3
    org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:319)
    org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:230)
    org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:206)
    org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:360)
    org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:173)
    org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:93)
    org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:68)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.jboss.bpm.console.server.util.GWTJsonFilter.doFilter(GWTJsonFilter.java:59)
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

    root cause

    java.lang.RuntimeException: No UI associated with PROCESS taskformExample-3
    org.jboss.bpm.console.server.FormProcessingFacade.provideForm(FormProcessingFacade.java:187)
    org.jboss.bpm.console.server.FormProcessingFacade.renderProcessUI(FormProcessingFacade.java:131)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:117)
    org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:260)
    org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:232)
    org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:166)
    org.jboss.resteasy.core.DispatcherUtilities.getJaxrsResponse(DispatcherUtilities.java:142)
    org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356)
    org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:173)
    org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:93)
    org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:68)

  11. Joram Barrez September 1, 2009

    @Sauarbh Did you add the form resource to the deployment?

    deployment.addResourceFromClasspath(…./my_form.ftl);

  12. RockerRocker December 3, 2009

    Hi,

    How should i use this example without JBPM console. I mean , when i use this example (task with form=some ftl), the process starts but does not open any new window with ftl file. Please let me know how to start the process containing form tag by start code as below
    executionService.signalExecutionById(execution.getId(), “transition”);

  13. Jeff Collins December 6, 2009

    None of your documentation links work. Are the documents somewhere else?

  14. Jiemin December 7, 2009

    This is a very good example.

    If a taskform needs data from a database, how can I do it? For example a taskform should show a list of prices, and these prices are saved in a
    database. How can I add a database query to the taskform?
    Thank you for your response.

  15. Joram December 9, 2009

    @RockerRocker: This is logically, since the form only makes sense in the console environment. If we would go down that path, we would need some Swing stuff or so … but that would bother more people than it would benefit others.

    @Jeff Collins: Right, the URL changed to http://docs.jboss.com/jbpm/v4/userguide/html_single/#gettingstartedquickly , I’ll update the article

    @Jiemin: currently you would have to do it by adding a separate activity before the task that fetches the data. Another, more elegant way is to add an event-listener to your task , where you fetch the data and add it to the process as variable.

  16. jsvegas December 10, 2009

    Hi,
    first of all thanks for the helpful example!

    The code is evident for me, but I always get the following error when I try to run it.
    I tried finding an error for hours and installed the demo setup on 2 differnt pcs, but allways the same error. Hmm, one thing: I used the jBPM 4.2 setup. May this be the cause of the error??

    Any help would be appreciated sooo much!!! Please! 😉

    10-Dez-2009 17:53:32 org.jnp.interfaces.TimedSocketFactory main
    [DEBUG]: createSocket, hostAddr: localhost/127.0.0.1, port: 1099, localAddr: null, localPort: 0, timeout: 0
    10-Dez-2009 17:53:32 org.jboss.remoting.transport.socket.MicroSocketClientInvoker main
    [DEBUG]: SocketClientInvoker[1b8e059, socket://127.0.0.1:4446] setting enableTcpNoDelay to true
    10-Dez-2009 17:53:32 org.jboss.remoting.transport.socket.MicroSocketClientInvoker main
    [DEBUG]: SocketClientInvoker[1b8e059, socket://127.0.0.1:4446] constructed
    10-Dez-2009 17:53:32 org.jboss.remoting.transport.socket.MicroSocketClientInvoker main
    [DEBUG]: SocketClientInvoker[1b8e059, socket://127.0.0.1:4446] setting enableTcpNoDelay to true
    10-Dez-2009 17:53:32 org.jboss.remoting.MicroRemoteClientInvoker main
    [DEBUG]: SocketClientInvoker[1b8e059, socket://127.0.0.1:4446] connecting
    10-Dez-2009 17:53:32 org.jboss.remoting.transport.socket.MicroSocketClientInvoker main
    [DEBUG]: Creating semaphore with size 50
    10-Dez-2009 17:53:32 org.jboss.remoting.MicroRemoteClientInvoker main
    [DEBUG]: SocketClientInvoker[1b8e059, socket://127.0.0.1:4446] connected
    10-Dez-2009 17:53:32 org.jboss.remoting.transport.socket.ClientSocketWrapper main
    [DEBUG]: reset timeout: 0
    Exception in thread “main” java.lang.IllegalStateException: Failed to find method for hash:893106003127215228 available={8594593460157411074=public abstract javax.ejb.EJBObject javax.ejb.Handle.getEJBObject() throws java.rmi.RemoteException, -2938908583525943695=public abstract java.lang.Object org.jbpm.enterprise.internal.ejb.RemoteCommandExecutor.execute(org.jbpm.api.cmd.Command) throws java.rmi.RemoteException, -7423251857241384719=public abstract void javax.ejb.EJBHome.remove(java.lang.Object) throws java.rmi.RemoteException,javax.ejb.RemoveException, -883843542736932254=public abstract java.lang.Object javax.ejb.EJBObject.getPrimaryKey() throws java.rmi.RemoteException, 7415355246179212884=public abstract boolean javax.ejb.EJBObject.isIdentical(javax.ejb.EJBObject) throws java.rmi.RemoteException, 4121927297169232143=public abstract void javax.ejb.EJBHome.remove(javax.ejb.Handle) throws java.rmi.RemoteException,javax.ejb.RemoveException, 4512095171315154818=public abstract javax.ejb.EJBHome javax.ejb.EJBObject.getEJBHome() throws java.rmi.RemoteException, -3260590760910195779=public abstract javax.ejb.Handle javax.ejb.EJBObject.getHandle() throws java.rmi.RemoteException, 6050892400105620910=public abstract org.jbpm.enterprise.internal.ejb.RemoteCommandExecutor org.jbpm.enterprise.internal.ejb.RemoteCommandExecutorHome.create() throws javax.ejb.CreateException,java.rmi.RemoteException, -1225864925247205563=public abstract void javax.ejb.EJBObject.remove() throws java.rmi.RemoteException,javax.ejb.RemoveException, 3781219857755091396=public abstract javax.ejb.EJBMetaData javax.ejb.EJBHome.getEJBMetaData() throws java.rmi.RemoteException, 8981122088959051067=public abstract javax.ejb.HomeHandle javax.ejb.EJBHome.getHomeHandle() throws java.rmi.RemoteException}
    at org.jboss.invocation.MarshalledInvocation.getMethod(MarshalledInvocation.java:407)
    at org.jboss.ejb.Container.invoke(Container.java:1027)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
    at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
    at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
    at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
    at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
    at org.jboss.invocation.unified.server.UnifiedInvoker.invoke(UnifiedInvoker.java:232)
    at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:908)
    at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:742)
    at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:695)
    at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:549)
    at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:230)
    at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:206)
    at org.jboss.remoting.Client.invoke(Client.java:1708)
    at org.jboss.remoting.Client.invoke(Client.java:612)
    at org.jboss.invocation.unified.interfaces.UnifiedInvokerProxy.invoke(UnifiedInvokerProxy.java:184)
    at org.jboss.invocation.InvokerInterceptor.invokeInvoker(InvokerInterceptor.java:365)
    at org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterceptor.java:197)
    at org.jboss.proxy.TransactionInterceptor.invoke(TransactionInterceptor.java:61)
    at org.jboss.proxy.ejb.SecurityContextInterceptor.invoke(SecurityContextInterceptor.java:64)
    at org.jboss.proxy.SecurityInterceptor.invoke(SecurityInterceptor.java:68)
    at org.jboss.proxy.ejb.StatelessSessionInterceptor.invoke(StatelessSessionInterceptor.java:112)
    at org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:101)
    at $Proxy1.execute(Unknown Source)
    at be.jorambarrez.jbpm4.demo.taskform.Main.main(Main.java:21)

  17. Joram December 15, 2009

    @jsvegas: I haven’t tested the code on 4.2 yet, so the cause can lie there. Instead of calling the remoteCommandExecutor, you can just configure a standalone ProcessEngine to go to the same database and deploy it through there. That will result in exactly the same functionality.

  18. Mauricio December 27, 2009

    Hi Joram

    First, congratulations for your excelent site. I’m new using jbpm4 and I’m studying jbpm4 based on your posts.

    Now I try to run this sample but I don’t use jboss as application server for jbpm4 and I tried to use tomcat.

    I have all files to run the vacations sample and I wrote this file for upload:

    package demo2;

    import org.jbpm.api.Configuration;
    import org.jbpm.api.NewDeployment;
    import org.jbpm.api.ProcessEngine;
    import org.jbpm.api.RepositoryService;

    public class Config {

    public static void main(String argv[]){

    ProcessEngine processEngine = new Configuration().setResource(“jbpm.cfg.xml”).buildProcessEngine();

    RepositoryService repositoryService = processEngine.getRepositoryService();

    NewDeployment newDeployment = repositoryService.createDeployment();
    newDeployment.addResourceFromClasspath(“demo2/hola.ftl”);
    newDeployment.addResourceFromClasspath(“demo2/vacas.jpdl.xml”);

    String salida = newDeployment.deploy();
    System.out.println(“salida….: “+salida);
    }

    }

    when I run this, output is:

    27-dic-2009 14:25:47 org.jbpm.pvm.internal.tx.HibernateSessionResource main
    [DEBUG]: —– beginning hibernate tx 4102111 ——————————————————–
    27-dic-2009 14:25:47 org.jbpm.pvm.internal.cmd.CheckDbCmd main
    [INFO]: jBPM version info: library[4.2], schema[null]
    27-dic-2009 14:25:47 org.jbpm.pvm.internal.tx.HibernateSessionResource main
    [DEBUG]: —– committing hibernate tx 14990140 ——————————————————-
    27-dic-2009 14:25:47 org.jbpm.pvm.internal.tx.HibernateSessionResource main
    [DEBUG]: —– beginning hibernate tx 10140777 ——————————————————–
    27-dic-2009 14:25:47 org.jbpm.pvm.internal.id.DatabaseDbidGenerator main
    [DEBUG]: last id -2 was consumed. acquiring new block…
    27-dic-2009 14:25:47 org.jbpm.pvm.internal.tx.HibernateSessionResource main
    [DEBUG]: —– beginning hibernate tx 12626425 ——————————————————–
    27-dic-2009 14:25:47 org.jbpm.pvm.internal.tx.HibernateSessionResource main
    [DEBUG]: —– committing hibernate tx 15272259 ——————————————————-
    27-dic-2009 14:25:47 org.jbpm.pvm.internal.id.DatabaseDbidGenerator main
    [DEBUG]: acquired new id block [1-10000]
    27-dic-2009 14:25:48 org.jbpm.pvm.internal.tx.HibernateSessionResource main
    [DEBUG]: —– committing hibernate tx 26108059 ——————————————————-
    salida….: 1

    okey, my problem is when I try to view deployments on gwt console, I’ve got this:

    * URL: ‘http://localhost:8080/gwt-console-server/rs/engine/deployments’
    * Action: ‘org.jboss.bpm.console.client.engine.UpdateDeploymentsAction’
    * Exception: ‘class com.google.gwt.http.client.RequestException’

    HTTP 500:
    Estado HTTP 500 –

    type Informe de Excepción

    mensaje

    descripción El servidor encontró un error interno () que hizo que no pudiera rellenar este requerimiento.

    excepción

    org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException
    org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:319)
    org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:230)
    org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:206)
    org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:360)
    org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:173)
    org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:93)
    org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:68)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.jboss.bpm.console.server.util.GWTJsonFilter.doFilter(GWTJsonFilter.java:59)

    causa raíz

    java.lang.NullPointerException
    org.jbpm.integration.console.ModelAdaptor.adoptDeployment(ModelAdaptor.java:208)
    org.jbpm.integration.console.ProcessEnginePluginImpl.getDeployments(ProcessEnginePluginImpl.java:54)
    org.jboss.bpm.console.server.EngineFacade.getDeployments(EngineFacade.java:75)
    sun.reflect.GeneratedMethodAccessor35.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:117)
    org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:260)
    org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:232)
    org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:166)
    org.jboss.resteasy.core.DispatcherUtilities.getJaxrsResponse(DispatcherUtilities.java:142)
    org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356)
    org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:173)
    org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:93)
    org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:68)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.jboss.bpm.console.server.util.GWTJsonFilter.doFilter(GWTJsonFilter.java:59)

    nota La traza completa de la causa de este error se encuentra en los archivos de diario de Apache Tomcat/6.0.20.
    Apache Tomcat/6.0.20

    can you help me??

    greetings

  19. Joram December 28, 2009

    @Mauricio: Which version of jBPM are you using? Te stacktrace throws an exception at a line which doesn’t exist annymore.

  20. Jiemin January 11, 2010

    Hello Joram

    Thanks a lot for your answer.

    Is it possible to implement a event on clicking any button in a taskform?

    Greetings

  21. Joram January 12, 2010

    @Jiemin: no, not like in JSF anyway. What you could do however is attach an event to the outgoing transition that follows by clicking the button

  22. Rajeshwari January 25, 2010

    Can you let me know how to start a process instance remotely? We are using JBPM v 4.3 and I could not locate any documentation about starting an instance remotely.

  23. Jesus February 23, 2010

    Hello.
    Where can I get the command “jbpm / CommandExecutor” that appears in the source code example?
    Or is there some other tutorial which explains the treatment dearchivos FTL?
    Thanks

  24. Hi July 19, 2010

    Hi,

    Is the free marker form designer template based ?

    I am trying to use jbpm4 for form designing. I have installed jbpm 4.3 on linux with Jboss5.1. I have also installed gpd on eclipse-jee-galileo 3.5.

    I want a drag and drop type form designing but i am not getting any such provision.

    Have i missed anything or form designing can only be done by coding?

    Thanks

  25. Anonymous August 5, 2011

    Hi,

    Is the free marker form designer template based ?

    I am trying to use jbpm4 for form designing. I have installed jbpm 4.3 on linux with Jboss5.1. I have also installed gpd on eclipse-jee-galileo 3.5.

    I want a drag and drop type form designing but i am not getting any such provision.

    Have i missed anything or form designing can only be done by coding?

    Thanks

Leave a Reply

Your email address will not be published.