The purpose of this post is to show simple runnable classes so readers can easily have an acquintance with the BPM 11g APIs, without needing to setup a complex web project.
We can manipulate BPM processes through a BPMServiceClient that we can acquire from a BPMServiceClientFactory. Below is a utility class that I set to easily acquire a client instance for my testing. This class need the following jars in the classpath: Oracle.bpm.client.jar, Oracle.bpm.project.model.jar, and Oracle.bpm.runtime.jar which are present inside the BPM folders in "MIDDLEWARE_HOME\jdeveloper\soa\modules" directory.
package soadev.bpmclient;
import java.util.HashMap;
import java.util.Map;
import oracle.bpel.services.bpm.common.IBPMContext;
import oracle.bpel.services.workflow.client.IWorkflowServiceClient;
import oracle.bpel.services.workflow.client.IWorkflowServiceClientConstants;
import oracle.bpel.services.workflow.client.WorkflowServiceClientFactory;
import oracle.bpm.client.BPMServiceClientFactory;
import oracle.bpm.services.client.IBPMServiceClient;
public class Fixture {
private static String url = "t3://localhost:8001";
public static BPMServiceClientFactory getBPMServiceClientFactory() {
Map<IWorkflowServiceClientConstants.CONNECTION_PROPERTY, String> properties =
new HashMap<IWorkflowServiceClientConstants.CONNECTION_PROPERTY, String>();
properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.CLIENT_TYPE,
WorkflowServiceClientFactory.REMOTE_CLIENT);
properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY
.EJB_PROVIDER_URL,url);
properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY
.EJB_INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
return BPMServiceClientFactory.getInstance(properties, null, null);
}
public static IBPMContext getIBPMContext(String username,
String password) throws Exception{
return getBPMServiceClientFactory().getBPMUserAuthenticationService()
.authenticate(username,
password.toCharArray(),
null);
}
public static IWorkflowServiceClient getIWorkflowServiceClient() {
return getBPMServiceClientFactory().getWorkflowServiceClient();
}
public static IBPMServiceClient getBPMServiceClient(){
return getBPMServiceClientFactory().getBPMServiceClient();
}
}
Below is a sample class that demonstrate querying of BPM process instances. It shows how to compose Predicate, Ordering, and IInstanceQueryInput objects.
package soadev.bpmclient;
import java.util.ArrayList;
import java.util.List;
import oracle.bpel.services.bpm.common.IBPMContext;
import oracle.bpel.services.workflow.repos.Column;
import oracle.bpel.services.workflow.repos.Ordering;
import oracle.bpel.services.workflow.repos.Predicate;
import oracle.bpm.services.instancemanagement.model.IProcessInstance;
import oracle.bpm.services.instancequery.IColumnConstants;
import oracle.bpm.services.instancequery.IInstanceQueryInput;
import oracle.bpm.services.instancequery.IInstanceQueryService;
import oracle.bpm.services.instancequery.impl.InstanceQueryInput;
public class GetProcessInstances {
public static void main(String[] args) {
GetProcessInstances client = new GetProcessInstances();
client.testGetProcessInstances();
}
public void testGetProcessInstances(){
try {
IInstanceQueryService queryService =
Fixture.getBPMServiceClient().getInstanceQueryService();
IBPMContext bpmContext =
Fixture.getIBPMContext("pino", "password1");
List<Column> columns = new ArrayList<Column>();
columns.add(IColumnConstants.PROCESS_ID_COLUMN);
columns.add(IColumnConstants.PROCESS_NUMBER_COLUMN);
columns.add(IColumnConstants.PROCESS_STATE_COLUMN);
columns.add(IColumnConstants.PROCESS_TITLE_COLUMN);
columns.add(IColumnConstants.PROCESS_CREATOR_COLUMN);
columns.add(IColumnConstants.PROCESS_CREATEDDATE_COLUMN);
Ordering ordering = new Ordering(IColumnConstants.PROCESS_NUMBER_COLUMN,
true,true);
Predicate pred = new Predicate(IColumnConstants.PROCESS_STATE_COLUMN,
Predicate.OP_EQ,
"OPEN");
IInstanceQueryInput input = new InstanceQueryInput();
input.setAssignmentFilter(IInstanceQueryInput.AssignmentFilter.MY_AND_GROUP);
List<IProcessInstance> processInstances =
queryService.queryInstances(bpmContext, columns, pred, ordering,
input);
System.out.println("ProcessId\tProcess#\tState\tTitle\t\t\t\t\tCreator\tCreadedDate");
for (IProcessInstance instance : processInstances) {
System.out.println(instance.getSystemAttributes().getProcessInstanceId()
+ "\t" + instance.getSystemAttributes()
.getProcessNumber()
+ "\t" + instance.getSystemAttributes().getState()
+ "\t" + instance.getTitle()
+ "\t" + instance.getCreator()
+ "\t" + instance.getSystemAttributes()
.getCreatedDate().getTime());
}
if (processInstances.isEmpty()){
System.out.println("no result");
}
} catch (Exception e) {
// TODO: Add catch code
e.printStackTrace();
}
}
}
Below is a sample result when I run it on my machine:
You can access the sample application on this link.
Kudus
Kudus to the following blogs and OTN forum posts:- RedStack-Process Instance List and Detail added to Worklist -for showing the right source of Column constants (IColumnConstants instead of the TableConstants constants).
- Matt Wang - Find something interesting today - for I guess starting it up.
Cheers!

Hi Pino,
ReplyDeletewhile running this application I am getting result as "no result".
I have bpm instances in my server.Can you tell me where might be the problem.
ProcessId Process# State Title Creator CreadedDate
no result []
Hi vishnu,
Delete1)Are you sure that those processes are not yet completed?
2)Did you provide appropriate user and password inforamtion in the code above "Fixture.getIBPMContext("pino", "password1");"?
3)Can you access the same processes using the same user in BP< workspace?
Regards,
Pino
Dear Pino,
ReplyDeleteThanks for this nice code.
I have a problem in this code snippet.
List processInstances =
queryService.queryInstances(bpmContext, columns, pred, ordering,
input);
I got the following exception:
javax.ejb.EJBException: CORBA MARSHAL 0 No; nested exception is:
org.omg.CORBA.MARSHAL: vmcid: 0x0 minor code: 0 completed: No; nested exception is: org.omg.CORBA.MARSHAL: vmcid: 0x0 minor code: 0 completed: No
org.omg.CORBA.MARSHAL: vmcid: 0x0 minor code: 0 completed: No
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
Can you help me solving this error?
Thanks a lot I solved the problem.
DeleteThe solution is that I was importing some wrong libraries. Always use weblogic.jar and remove any other weblogic client library. This will solve the problem
Can this sample code be used in 11.1.1.6 env? I run this sample in 11.1.1.6 env then I get error message as below:
ReplyDeleteException in thread "main" java.lang.NoClassDefFoundError: oracle/bpm/metadata/history/HistoryService
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:630)
at java.lang.ClassLoader.defineClass(ClassLoader.java:614)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:305)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:246)
at oracle.bpm.client.BPMServiceClientFactory.getBPMServiceClient(BPMServiceClientFactory.java:240)
at oracle.bpm.sample.test.Fixture.getBPMServiceClient(Fixture.java:44)
at oracle.bpm.sample.test.GetProcessInstances.testGetProcessInstances(GetProcessInstances.java:26)
at oracle.bpm.sample.test.GetProcessInstances.main(GetProcessInstances.java:21)
Caused by: java.lang.ClassNotFoundException: oracle.bpm.metadata.history.HistoryService
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:305)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:246)
... 16 more
Can anybody know what is going on & how to solve this?
Hi,
ReplyDeletePlease see the running project on 11.1.1.6 at my github repo below:
https://github.com/rommelpino/bpmclientapp
Hi,
ReplyDeleteI have the same issue as 李加西, can you share what are the different of the source code to work with 11.1.1.5 and 11.1.1.6?
Interestingly, if I add jar oracle.bpm.metadata-interface.jar into my project war file, then it work on on 11.1.1.6 and I can get rid of the error.
Thanks,
@QuyTran: Bạn là người Việt nam phải không?
DeleteHi Pino,
ReplyDeleteWe are trying to get CompositeInstanceId , CompositeName of all the process instances with matching PROTECTEDTEXTATTRIBUTE1 value.
But not getting the results, if we use predicate as below :
Predicate pred = new Predicate(Column.getColumn("PROTECTEDTEXTATTRIBUTE1"), Predicate.OP_EQ, "2200");
If we leave the predicate, then the instances are returned, but the methods
processinstance.getSca().getCompositeInstanceId()
processinstance.getSca().getCompositeName());
are not returning any values.
Could you please help?
Regards,
Subha