Raise and Capture EDN Events for SOA / BPM Human Task Components

The Human Task component offers functionality to raise EDN events when certain actions related to a Task occur. The screenshot below shows the page in JDeveloper where this functionality can be initialised:


It is then your responsibility to implement the functionality that captures the triggered EDN events and process them in a way that fits your requirements.

I will cover an example where:
  • An OnAssigned event is raised
  • Captured by a Mediator in a separate SOA Composite 
  • BPEL in SOA Composite sends out an email notification. 
Lets get started
1. We have a very basic SOA/BPM composite which has 1 BPMN and 1 Human Task component as follows:


2. We want to modify the Human Task component so that it raises EDN Events for specific actions. The below screenshot shows that the Human Task will fire OnAssign and OnCompleted EDN events. 

Once you have completed that, there are no further modifications required for the current project. It has been configured so that an EDN event will be raised. The BPM project can be deployed to the SOA Server.

Now we must implement functionality to capture the specific EDN Events. 

3. We will capture the EDN events in a new SOA composite. Create a new SOA Project SOAReceiveHumanTaskEvents


4. In the SOA Composite, drag on a Mediator component. Select Subscribe to Events as the Mediator Template: 

5. We must define the definition of the EDN event is captured, click on the Green plus icon: 

6. Click on the Magnifying glass and select HumanTaskEvent.edl. This definition is provided by Oracle and is located in MDS (ensure you have a connection to your SOA server MDS in resource palette) - it can be navigated to via the below structure:

7. Click OK and select the specific Event you want your Mediator to subscribe to. Considering we want to subscribe to Assign events, choose OnTaskAssigned from the list:

8. Click OK. In the Mediator Template, you can add further Event subscriptions so that your Mediator can subscribe to multiple events. You can then define the routing that takes place by the Mediator when a specific Event is captured. The below screenshot shows that the Mediator also subscribes to OnTaskCompleted events:

9. Once you click OK, your composite will look like this: 

10. Now we need to implement a component to which the Mediator will route to once a specific EDN event is captured. We will add a simple BPEL component into the composite. There is a TaskNotification.xsd schema that can also be utilised from MDS for the input/output for the BPEL but for this example, it is not a requirement:

11. Inside the BPEL, drag in an Email component and populate the fields as such:

12. Once your BPEL is complete, close it and return to the Composite view. Now we need to add a wire from the Mediator to the BPEL component. Drag a wire from the Mediator to the BPEL - a dialog is displayed asking for the Operation to be triggered for a specific EDN event caught: 

13. Once the Event Mediator has been wired, deploy the Composite to your SOA server so that we can test it.

14. Create a test instance for the BPM Project:

15. Launch the Flow Trace and we can see that an OnTaskAssigned Event was triggered, our SOAReceiveHumanTaskEvents service caught the event and the Mediator routed it to the TaskAssignedBPEL component:

16. To complete the example, the TaskAssignedBPEL sends out an Email Notification:

Further Comments
1. In this example, a separate SOA project was created to capture and process  the EDN events. We could have implemented the Mediator to capture events within the BPM project. However, the separation approach increases abstraction, reduces complexity and improves maintainability. 

2. Sending an Email at the end of the EDN capture event is just an example, but it shows the capabilities available. We can implement auditing mechanisms for each type of action on a Task or further extend the Notification capabilities available such as Sending an SMS, etc.




Configure User holidays or vacations for automatic Human Task assignment in Default and Custom BPM Workspace

This post is demonstrated using 11.1.1.7

Configuring User Holidays/Vacations in BPM is fairly straight forward. The users can set up Holidays and select other Users to reassign tasks to. So if a task is assigned to a specific User and that user is on holiday, then the task is automatically re-assigned to the User the user has chosen.

They can make use of this functionality via the Default BPM Workspace or from a custom BPM Workspace implementation.

Default BPM Workspace (localhost:port/bpm/workspace)
We will perform the User Holiday tests with our good friend jcooper.

1. Log into the BPM Workspace

2. Click on Preferences at the top right:

3. Click on Rules on the left:

4. Click on Vacation Period (disabled)
    - Tick Enable Vacation Period
    - Select the Start and End Date
    - Tick Reassign to and look up the User you would like to reassign tasks to
    - Click Save

Once saved, the Vacation Period rule will change to Vacation Period (enabled) to indicate that a Vacation/Holiday period is active:

5. The above step is the simple quick way to create a holiday period. The functionality offers a further advanced approach to setting up rule based reassignments based on certain conditions e.g. the task name. Multiple rules can be enabled so that assignment of different tasks can be handled in different ways.

To view this functionality, click on My Rules then click on the green plus. The below screenshot shows an example of what a user could enter:

6. To test the functionality, I have used a simple BPM process where the first step is a Human Task component and is assigned to jcooper when initialised.

Once a test case is created, when we drill into the initialised human task instance in the Flow Trace of the EM, we can see that it was firstly assigned to jcooper, then the reassignment vacation rule removed it from jcooper and created the same instance for achrist - our chosen reassignment candidate:

7. We can log into the BPM Workspace with achrist and find an instance of the BPM Process awaiting her attention:



Custom BPM Workspace
If you have a custom BPM application implemented via adflibTaskListTaskFlow.jar, then you can make use of the task flow provided by this jar. The task flow is called rules-task-flow-definition.

Expose this task flow on a page and the user will see the same Rules page from the Default BPM Workspace. Be sure to grant this task flow priviledges in jazn-data.xml before deploying.


Note: I do not think it is possible for an admin to control Vacation rules on behalf of Users using the UI. So if a User comes back from Vacation/Holiday, it is their responsibility to ensure that their Vacation Rules are correct. An admin may be able to modify Vacation Rules on behalf of the user using the BPM API... but that is a separate investigation and would require a separate post! :)

Part 2 - Send emails from Oracle BPM using Mail Activity - Implement Mail Activity in BPM

Before going ahead with this implementation, please ensure you have completed the EM Configuration. This can be completed by following Part 1 of this blog post:
Part 1 - Send emails from Oracle BPM using Mail Activity - Weblogic EM Configuration

Implement a send Mail activity within a BPM Process in JDeveloper BPM Studio

In a BPM Process there is quite often the requirement to send an email to user(s) to keep them updated or to make them aware of an event that has taken place. It is actually straight forward to achieve this.

We will use a very simple BPM process to illustrate:

1. Firstly, we will create a Data Object to store the entire output payload of the worked human task called Task_DO of type TaskExecutionData:

2. Next, select the Mail Activity from the Notification components:

And drag it into the BPM Process:

3.  In the General tab, we populate 2 fields. 
     - Enter Default into the From Account field, this will be obtained from your configuration in EM.
     - Enter the Email address you want to send an email to in the To field. This can also be extracted from a Data Object via XPath. To send to multiple emails, separate each email address with a semi colon (;)

4. In the Content tab, you populate the Subject and Body of the email. This can be made up of static text or from expressions as shown below:
For reference, the expression in the Body is: concat('Task Number ', bpmn:getDataObject('Task_DO')/ns:systemAttributes/ns:taskNumber, ' has been worked by ', bpmn:getDataObject('Task_DO')/ns:systemAttributes/ns:updatedBy/ns:displayName, ' with an outcome of ', bpmn:getDataObject('UserTask_outcome'))

5. We can also add attachments to the mail via the Attachments tab. The value must map to an element of type base64Binary, which holds the document in a binary format. The Mime Type must reflect the type of stored document too.



If you navigate back to your Composite, you will see a new external reference created to a Notification Service Web Service. The WSDL referenced is NotificationService.wsdl and is stored in MDS so you do not have to worry about maintaining it:


6. Now, your implementation from a development perspective is complete. Let's see the project in action.

Deploy the BPM project to your Weblogic SOA server.

7. Create an instance for the deployed BPM Project via EM:


8. Work the running instance of the Human Task:


9. Check the BPM Flow to confirm a successful flow.


10. Check your Email Inbox for the Email address you entered. Voila!


11. You can also monitor the status of instances of the Email User Messaging Driver from the EM:



Part 1 - Send emails from Oracle BPM using Mail Activity - Weblogic EM Configuration

To get sending Emails to work from your SOA/BPM process, there is a mandatory requirement to firstly configure Weblogic Enterprise Manager (EM) so that it registers with your Email server.

Once it has been set up, when a send Email component is implemented, it will use this configuration at run time to Send/Receive emails successfully. Follow below steps to make the required configuration in EM.

Part 2 of this blog post shows how to implement sending Emails in a BPM process (Link)

Assumptions
This post assumes you have an Email Server running successfully in your infrastructure.

Configure Weblogic Enterprise Manager (EM) to register with Email Server

1.
Log into Weblogic Server EM (localhost:7001/em)

2. Click on soa-infra:

3. Navigate to Workflow Properties via SOA Infratructure and SOA Administration:


 4. - Notification Mode: Select Email from the drop down.

     - Email From Address: Enter an email address that ends with your Email Server domain name e.g. bpmadmin@CompanyDomainName.co.uk. This is the email address users will receive emails from.
     - Email Actionable Address: Same as above
     - Email Reply To Address: This is the reply email used when a user clicks reply on a sent email. If you do not support replies, then use something like no_reply@CompanyDomainName.co.uk


5. Click Apply.

6. Next, on the same page, click on Go to the Messaging Driver Page:

Alternatively, you can also get to the same screen via the screenshot below:

7. For the User Messaging Email Driver, click on the pencil to Configure Driver:


8. Now, the main field to populate is OutgoingMailServer. In this field, populate with the Email Server name.

Our test Email Server does not require a Username and Password, however, yours might. If so, populate OutgoingUsername and OutgoingPassword.

The rest can be left as default.Once completed, click Apply:

Note: The above changes will support only sending emails, not receiving emails. If you would like to support receiving emails, then values need to be populated for IncomingMailServer too.

9. Once the above changes have been made, do not forget to restart your Weblogic Server for changes to take effect. 

Once the server is back up, your server should be hopefully configured to support sending emails!