In the previous post, we used SOAP client to invoke BPM java APIs to create a human task. As i mentioned, we will not be able to test remote interface unless we create some java application and deploy to WLS. So in this post, i will create ADF BC Service project to demonstrate this and assume the readers have basic understanding on how to create ADF BC Services.
Following code snippet shows getting the remote client to invoke BPM java API. note the usage of URL.
//admin credentials private static final String wlsUser = "weblogic"; private static final String wlsPassword = "weblogic1"; //soa-infra url private static final String soaURL = "t3://localhost:7005/soa-infra"; private Map<CONNECTION_PROPERTY, String> getClientProp(String clientType) { Map<CONNECTION_PROPERTY, String> properties = new HashMap<CONNECTION_PROPERTY, String>(); if (WorkflowServiceClientFactory.REMOTE_CLIENT.equals(clientType)) { properties.put(CONNECTION_PROPERTY.EJB_INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); //soa-infra url properties.put(CONNECTION_PROPERTY.EJB_PROVIDER_URL, soaURL); //admin user properties.put(CONNECTION_PROPERTY.EJB_SECURITY_PRINCIPAL, wlsUser); //admin pwd properties.put(CONNECTION_PROPERTY.EJB_SECURITY_CREDENTIALS, wlsPassword); } else if (WorkflowServiceClientFactory.SOAP_CLIENT.equals(clientType)) { properties.put(CONNECTION_PROPERTY.SOAP_END_POINT_ROOT, "http://localhost:7005"); properties.put(CONNECTION_PROPERTY.SOAP_IDENTITY_PROPAGATION, "non-saml"); } return properties; } private IWorkflowServiceClient getWfServiceClient() { IWorkflowServiceClient wfSvcClient = null; wfSvcClient = WorkflowServiceClientFactory.getWorkflowServiceClient(WorkflowServiceClientFactory.REMOTE_CLIENT,getClientProp(WorkflowServiceClientFactory.REMOTE_CLIENT),null); return wfSvcClient; }
The AM method code which is exposed as webservice method remains similar as shown below.
private Element getTaskPayload() throws Exception { String payloadStr = " <payload xmlns=\"http://xmlns.oracle.com/bpel/workflow/task\">" + "<EmployeeExpenseInput xmlns=\"http://xmlns.oracle.com/expenses/approval/schema\">" + " <employeeId></employeeId> " + " <firstName></firstName> " + " <lastName></lastName>" + " <expenseType></expenseType>" + " <expenseDescription></expenseDescription>" + " <expenseLocation></expenseLocation>" + " <expenseDate></expenseDate>" + " <amount></amount>" + "</EmployeeExpenseInput>" + " </payload>"; Document doc = null; try { doc = XMLUtil.parseDocumentFromXMLString(payloadStr); } catch (Exception e) { throw new Exception("Exception in parsing string to xml"); } return doc.getDocumentElement(); } public String createHumanTask(String taskTitle) { String taskId = null; IInitiateTaskResponse taskResponse = null; try { ObjectFactory of = new ObjectFactory(); Task newTask = of.createTask(); //set required attribute before calling BPM task api newTask.setTaskDefinitionId(taskNameSpace); newTask.setPayloadAsElement(getTaskPayload()); newTask.setCreator(wlsUser); if(taskTitle == null || taskTitle.isEmpty()) { newTask.setTitle("BPM API TESTING USING CREATE HUMAN TASK"); } else { newTask.setTitle(taskTitle); } newTask.setCategory("TESTING"); newTask.setIdentificationKey("587776676"); taskResponse = getWfServiceClient().getTaskService().initiateTask(newTask); if (taskResponse != null) { newTask = taskResponse.getTask(); taskId = newTask.getSystemAttributes().getTaskId(); } } catch (Exception e) { e.printStackTrace(); } return taskId; }
When the service method is invoked for the first time, we may observe the following error.
<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Header/> <env:Body> <env:Fault> <faultcode>env:Server</faultcode> <faultstring>JBO-29000: Unexpected exception caught: java.lang.NoClassDefFoundError, msg=oracle/bpel/services/workflow/task/model/ObjectFactory</faultstring> <detail> <tns:ServiceErrorMessage xmlns:tns="http://xmlns.oracle.com/adf/svc/errors/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <tns:code>29000</tns:code> <tns:message>JBO-29000: Unexpected exception caught: java.lang.NoClassDefFoundError, msg=oracle/bpel/services/workflow/task/model/ObjectFactory</tns:message> <tns:severity>SEVERITY_ERROR</tns:severity> <tns:detail xsi:type="tns:ServiceErrorMessage"> <tns:message>oracle/bpel/services/workflow/task/model/ObjectFactory</tns:message> <tns:severity>SEVERITY_ERROR</tns:severity> <tns:exceptionClassName>java.lang.NoClassDefFoundError</tns:exceptionClassName> </tns:detail> <tns:exceptionClassName>oracle.jbo.JboException</tns:exceptionClassName> </tns:ServiceErrorMessage> </detail> </env:Fault> </env:Body> </env:Envelope>
This error can be resolved by adding oracle.soa.workflow.wc as library reference in weblogic-application.xml. The file can be found in Application Resources -> Descriptors -> META-INF in JDeveloper.
<library-ref> <library-name>oracle.soa.workflow.wc</library-name> </library-ref>
Testing
Input
Output
The sample ADF BC service project can be found here.