RSS

Case management for the knowledge worker era

Companies have been using workflow and content management for many, many years. In IT we got used to the term Business Process Management (BPM) whenever we spoke of automated process execution. Not so strange since the term BPM was adopted by all the major software vendors and has received a lot of attention as “the” way to achieve process automation and integration.

There are however many different definitions of BPM, where some are technical and others are business oriented. But if we look at the Gartner definition:

Business process management (BPM) is a discipline that uses various methods to discover, model, analyze, measure, improve, and optimize business processes.  A business process coordinates the behavior of people, systems, information, and things to produce business outcomes in support of a business strategy. Processes can be structured and repeatable or unstructured and variable. Though not required, technologies are often used with BPM. BPM is key to align IT/OT investments to business strategy

 An interesting (and correct) remark by Gartner that technology is not required for BPM, however the general idea (in IT) has been that BPM equals process automation. The business process is summarized to a complete definition until the level that it can be executed as a program. The efficiency gains of automating the business process much exceed the up-front effort to fully identify it and make it executable. An effort which can initially be very large where the cost is only repaid over many instances of the process. So this approach will only work on highly predictable which is highly repeatable. It’s in some way identical to a factory production line where a huge amount of products justifies the initial up-front factory costs.

tesla.jpg

The Tesla factory production line

Using this approach to discover, implement, and execute complex and dynamic processes will be less economically beneficial. We assume that the less complex a process is, the more likely a lower initial investment is required. And the more often the process will be executed, the greater the financial gain and/or business case.

When we talk about low complexity high volume processes, we can also identify this as so called “routine work”. Routine work is well known and can be planned to a high level of detail. The process uses a general pattern and is done in a very similar way every time. Because routine work is so predictable and repeatable it has been an ideal candidate for successful BPM implementations. Simply due to the fact that the return of investment for routine work is more likely and easily gained.

Agility and Adaptability

Back in 1958 James March & Herbert Simon wrote the management science classis Organizations [2] and concluded that an organization is successful not because it does everything in exactly the same way every time, but because it is flexible enough to adapt and respond to the changes around it. Looking at the present, with changing regulations, new laws, new markets and changing business models this statement seems more true than ever. We therefore can conclude that a rigidly specified organization, that has every process fully planned in detail, will find itself unable to respond to changes.

Maybe we might accept that in real life there is never work that is 100% predictable, nor is there work that is 100% unpredictable. So it seems that the approach to automation of more complex and dynamic business processes requires more flexibility.

In 1992 the legendary business management guru Peter Drucker explains that matching a company’s strengths to the changes that have already taken place produces, in effect, a plan of action. Competitive advantage comes not from steely corporate rigor, but from organizational agility and the adaptability of support systems. [4]

Unpredictable work

Scientific management as once defined by Frederick Winslow Taylor has been at the heart of business process automation to date. And we have seen how it works for predictable and repeatable processes since they are an ideal candidate for executable BPM. But not all work is predictable and many organizations hold processes which are even unpredictable. When we talk about actions and events in processes being unpredictable, we mean that the sequence of human acts is not known in advance, and the course of the process may vary greatly for every instance. We can easily think of examples like medical care, law enforcement and complex industrial and financial processes. 

Rise of the Knowledge Worker

Whenever we read up on the knowledge worker terminology we always come across one individual, namely management guru Peter F. Drucker. Drucker made the first reference to knowledge work in his 1959 book Landmarks of Tomorrow. He loosely defined a knowledge worker as “someone who knows more about his or her job than anyone else in the organization.” What is important is that Drucker already then understood the uniqueness of the job that a knowledge worker performs.

PeterDrucker

Peter F. Drucker 

Drucker predicted during the 90’s that that the most valuable asset of a 21st-century institution (business or non-business) will be its knowledge workers and their productivity [5]. He even wends further and claimed that the productivity of knowledge and knowledge workers is likely to become the decisive competitive factor in the world economy [6].

So even back then there was already an understanding by business management leaders that the most valuable assets during the industrial revolution were a company’s mass production equipment. Nowadays we can recognize high volume business processes executed in BPM as a form of mass production. Upfront investment which generates value overtime by repetitively producing the same expected result. So if we recognize common grounds between industrial mass production and BPM production work nowadays, what can we say about automation knowledge work in the present or near future? Keeping in mind that Davenport more recently (2005) expresses the importance of knowledge-worker productivity stating that “Within organizations, knowledge workers tend to be closely aligned with the organization’s growth prospects [7]. So with this in mind, how can we efficiently support these knowledge workers ?

Today’s jobs are more dynamic, more ad hoc and require more skills and interaction with other specialists. Besides that, the amount of information available and necessary for a single worker has increased dramatically. So knowledge work cannot be matched on a traditional rigid business process (where work is performed according to a detailed plan prepared in advance). Because as knowledge work proceeds, the sequence of activities depends on the situational information. This is the nature of knowledge work. As the available information or external influences change the process has to be dynamic. It is not simply a matter of plan and execute but a continuous dynamic set of activities in an adaptive flow of execution. And while rules like regulations, laws and organization standards will certainly constrain the actions of the knowledge worker no plan is ever final until the end is reached.

Case Management

 To digitally support the knowledge workers to dynamically act in their cases, we need some sort of case management solution. A way to dynamically start activities like processes and tasks throughout the case lifecycle. In such a way that the knowledge worker can act on the information available to determine which actions to take. The case management solution should therefore be “information” driven.

pic_information-centric

Information drives the case

Forrester’s [3] defines case management as a highly structured but collaborative, dynamic, and information-intensive process driven by outside events requiring incremental and progressive responses from the business domain handling the case.

(Unstructured) data like documents in an enterprise content management (ECM) system and processes in business process management (BPM) suites are clearly key requirements for any case management offering. But only processes and content are insufficient. By adding advanced business rules and clear business analytics in the mix, you get the 4 essential components of a case management solution.

pic_overview

The 4 essential components for case management

Advanced business rules allow for guidance to make sure certain actions are made available or withdrawn during the case lifecycle. And dashboards with case analytics allow for real-time insight on all running cases.

These 4 core components combined with good (knowledge) user experience and the ability to integrate with your service oriented landscape are basically the case management product you want. Add some policies management and even some social collaboration and you have a set of existing proven technologies, which together have a very interesting proposition for the modern knowledge worker needs.

 

References:

  1. Keith D. Swenson; Mastering the Unpredictable: How Adaptive Case Management Will Revolutionize the Way That Knowledge Workers Get Things Done; 2010
  2. James G. March & Herbert A. Simon; Organizations; 1958
  3. Connie Moore, Craig Le Chair & Ralph Vitti (Forrester Research); Dynamic Case Management, an old idea catches new fire; 2009
  4. Peter F. Drucker; Planning for Uncertainty; 1992
  5. Peter F. Drucker; Knowledge Worker Productivity, The Biggest Challenge; 1999
  6. Peter F. Drucker; Rise of the Knowledge Worker; 1998
  7. Thomas H. Davenport; Process Management for Knowledge Work; 2005

 

 

 
Leave a comment

Posted by on 16-08-2016 in Uncategorized

 

Tags: ,

Cleaning up your old excess Docker containers

Every docker run command creates a container on your system. When you exit the container (and it is no longer running) it is still there on disk and can be seen with

docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea520a35da1f jvzoggel/kafka "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago kafka1
46067fe01dc4 jvzoggel/kafka "/bin/bash" 3 minutes ago Exited (0) 2 minutes ago kafka2
0b7bcb382e65 jvzoggel/kafka "/bin/bash" 3 minutes ago Exited (0) 3 minutes ago kafka3

The containers that are not running will not consume any system resources except disk space, but it is usually good to clean up after yourself so ..

Automatically clean-up after yourself

The Docker documentation describes how to automatically clean up the container and remove the file system when the container exits:
   –rm=false: Automatically remove the container when it exits (incompatible with -d)
The above shows that by default containers are not removed, so by adding –rm=true or just the short-hand –rm will do the trick:

docker run -i -t --rm jvzoggel/kafka /bin/bash

When you exit from the container it will be automatically removed from disc.

Manually clean-up your stuff

Another method (all credits: Guillaume J. Charmes) is the command:

docker rm `docker ps --no-trunc -aq`

which will remove all containers in a elegant way

 

 
Leave a comment

Posted by on 05-08-2016 in Uncategorized

 

Tags:

How to implement permissions on your activities with Oracle Adaptive Case Management ?

When our Oracle Adaptive Case Management project started we initially used the default permissions on the case (Public, Restricted) to make sure our activities where available to the correct BPM application roles. A complex authorization model of roles, with LDAP groups, with users to allow access to the activities, but also custom UI and human tasks.

default_acm_permissions

An important concept of knowledge worker automation (on which off course our whole case is based) is that the users should not be locked into rigid BPM processes (and access constraints I would like to add) which the IT department came up with. So activities on one hand would be allowed access to by all internal knowledge workers anyway, because: “hey .. they are knowledge workers and know best, right ?”

The first exception

However for some exceptions we got the requirements to only allow a specific role to a specific activity. So what we did was adding a new permission for that role and made sure that the activity was only available for that role.

Screen Shot 2016-07-29 at 11.08.18

new permission for role Senior Employee

Screen Shot 2016-07-29 at 11.08.35

set the permission on the activity

And all was good, for a while …

Challenge accepted

This went pretty well for some time, until we ran into a new requirements which made us rethink our design:

  • We had the requirement that on a specific activity where currently only permRoleSeniorEmployee had access now, we had to add the role Medior Employee. Therefor the original design thought that all activities are available for all employees OR for just 1 specific role (senior) for quality assurance was no longer valid.

So we looked at our options :

  1. We allowed the application role Medior to the permRoleSenior permission for a quick win for now, but looking at our naming convention this would be a bit confusing in the long run. All other options below required a code change, build and deploy so we tried to be smart to prevent this from ever happening again.
  2. The activity sadly doesn’t have a multi-select (both 11g and 12.2.1) so it is not possible to select both permRoleSenior and permRoleMedior
  3. We could add a new permission like permRoleMediorAndSenior, but still limiting ourselves to the code base
  4. In future identical requirements we do not want to change the codebase of our ACM project and permissions should be able to change on runtime. So both option 2 and 3 are not smart in the long run.

Our “Best Practice”

We have long running cases (like, really long) and redeployment of a new version will not fix any new permissions requirements on running instances. However since we have 50+ activities in our case where most of them are (currently) allowed access to by all employee levels (the example here just uses 2, but in reality we have much more roles). So the idea of creating a separate permission for each activity was not appealing, we eventually decided that we just had to. So for each activity we created a unique permission and configured in on the activity.

Screen Shot 2016-07-29 at 11.41.15

new unique permission for the activity

Screen Shot 2016-07-29 at 11.41.20

set the permission on the activity

 

Scripted Configuration

Because know we have a LOT of permissions and roles we are gratefull for having a WLST script to make sure these are automatically configured through our environments. Scripts have some customization, but the main logic was found on the big WWW (sorry, not sure where and who to give credits).

So first we need a property file


permission.total=2

# permActMyProcess2
permission.1.appstripe=OracleBPMProcessRolesApp
permission.1.principalclass=oracle.security.jps.service.policystore.ApplicationRole
permission.1.principalname=RubixCasus_1.0.MediorEmployee
permission.1.permclass=oracle.bpm.casemgmt.permission.CasePermission
permission.1.permtarget=RubixCasus_1.0.PERMACTMYPROCESS2.ACTIVITY
permission.1.permactions=INVOKE
permission.2.appstripe=OracleBPMProcessRolesApp
permission.2.principalclass=oracle.security.jps.service.policystore.ApplicationRole
permission.2.principalname=RubixCasus_1.0.SeniorEmployee
permission.2.permclass=oracle.bpm.casemgmt.permission.CasePermission
permission.2.permtarget=RubixCasus_1.0.PERMACTMYPROCESS2.ACTIVITY
permission.2.permactions=INVOKE

And the WLST script


from java.util import Properties
from java.io import FileInputStream
from java.io import File
from oracle.security.jps.mas.mgmt.jmx.policy import PortablePrincipal
from oracle.security.jps.mas.mgmt.jmx.policy import PortablePermission
from oracle.security.jps.mas.mgmt.jmx.policy.PortablePrincipal import PrincipalType
import os, sys

PROPERTIES = sys.argv[1]

propInputStream = FileInputStream(PROPERTIES)
configProps = Properties()
configProps.load(propInputStream)
propInputStream.close()
pmTotal=configProps.get("permission.total")
print '... property permission.total:',pmTotal

connect('weblogic', 'welcome1', 't3://myserver:7001')

print '============================='
print 'Granting permissions...'
print '============================='
print '... property permission.total:',pmTotal
i=1
while (i <= int(pmTotal)) :

  pmAppStripe=configProps.get("permission."+str(i)+".appstripe")
  pmPrincipalClass=configProps.get("permission."+str(i)+".principalclass")
  pmPrincipalName=configProps.get("permission."+str(i)+".principalname")
  pmPermClass=configProps.get("permission."+str(i)+".permclass")
  pmPermTarget=configProps.get("permission."+str(i)+".permtarget")
  pmPermActions=configProps.get("permission."+str(i)+".permactions")

  domainRuntime()
  jpsBean = ObjectName('com.oracle.jps:type=JpsApplicationPolicyStore')

  print 'INFO - Index:',str(i),'| Name:',pmPrincipalName,'| Target:',pmPermTarget,' |Action:',pmPermActions

  principal = PortablePrincipal(pmPrincipalClass, pmPrincipalName,PrincipalType.CUSTOM)
  params = [pmAppStripe, principal.toCompositeData(None)]
  sign = ["java.lang.String", "javax.management.openmbean.CompositeData"]
  perms = mbs.invoke(jpsBean, "getPermissions", params, sign)

  permExists = false
  for perm in perms:
    p = PortablePermission.from(perm)
    if(p.target==pmPermTarget and p.permissionClassName==pmPermClass and pmPermActions in p.actions):
      permExists = true
      print 'INFO - Permission',pmPermTarget,'(',pmPermActions,') already set for ',pmPrincipalName
      break

    if(permExists==false):
    try:
      grantPermission(appStripe=''+pmAppStripe,principalClass=''+pmPrincipalClass,principalName=''+pmPrincipalName, permClass=''+pmPermClass, permTarget=''+pmPermTarget,permActions=''+pmPermActions)
      print 'INFO - Permission',pmPermTarget,'(',pmPermActions,') set for ',pmPrincipalName
    except:
      print 'ERROR - Failed adding permission ',pmPermTarget,'(',pmPermActions,') to',pmPrincipalName
      dumpStack()
      print sys.exc_info()
      os._exit(1)

  i = i + 1

Conclusion

The longer we thought about this the more we think the current permission solution lacks some maintainability. It would (for instance) be nice if the BPM WorkSpace would allow some graphical interface where all activities could be easily connected to the (already their) BPM Application Roles. So hopefully in the near future ?

 
Leave a comment

Posted by on 29-07-2016 in BPM, Oracle

 

Tags: , , , , ,

Using the Human Task identification key to set your own taskId with Oracle BPM (and BPEL)

Requirement

Our Oracle ACM/BPM system will create tasks which will not only be handled by users in a front-end but also through a B2B connection with our external partners. So we need to publish a message to our B2B partners when a task is available. The challenge here is that the taskId is externally generated in the Human Task component and for the BPM (and BPEL) process the taskId is unknown until the task is closed. So we need to generate our own taskId or a trick to capture and retrieve the taskId outside the process and send it back to the process.

Solution

We first looked at the option to use the Human Task onAssigned event which we could capture through EDN and handle accordingly. However one of the requirements was that we would not communicate an internal (task) ID to our B2B partners so needed to generate our own ID instead. So we thought about generate our own guid() and place it on one of the ProtectedTextAttributes so we could use this to query the correct task. But Laurens van der Starre pointed us out that Oracle actually has a solution for this and we could use the identification key on the Human Task.

So below is an example of a process where our own key (a guid) is generated in the script task and then placed on the human task.

process

Map the generated variable on the Identification Key

task

Runtime

In EM I can see that the generated key is 35373030303632323333383139353637. So we would normally communicate this to our B2B partner. Then on request from our B2B partner to send the details of the task service we can query the correct task using the Oracle TaskQueryService:


<soapenv:Envelope>
 <soapenv:Header/>
 <soapenv:Body>
 <tas:taskListRequest>
 <com:workflowContext>
 <com:credential>
 <com:login>${#Project#username}</com:login>
 <com:password>${#Project#password}</com:password>
 </com:credential>
 </com:workflowContext>
 <tas1:taskPredicateQuery>
 <tas1:displayColumnList>
 <tas1:displayColumn>IDENTIFICATIONKEY</tas1:displayColumn>
 </tas1:displayColumnList>
 <tas1:optionalInfoList>
 <!--tas1:taskOptionalInfo>Comments</tas1:taskOptionalInfo-->
 <!--tas1:taskOptionalInfo>Attachments</tas1:taskOptionalInfo-->
 <!--tas1:taskOptionalInfo>Payload</tas1:taskOptionalInfo-->
 </tas1:optionalInfoList>
 <tas1:predicate>
 <tas1:assignmentFilter>All</tas1:assignmentFilter>
 <tas1:clause>
 <tas1:column>IDENTIFICATIONKEY</tas1:column>
 <tas1:operator>EQ</tas1:operator>
 <tas1:value>35373030303632323333383139353637</tas1:value>
 </tas1:clause>
 </tas1:predicate>
 </tas1:taskPredicateQuery>
 </tas:taskListRequest>
 </soapenv:Body>
</soapenv:Envelope>

Result

 

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
 <env:Header/>
 <env:Body>
 <taskListResponse xmlns="http://xmlns.oracle.com/bpel/workflow/taskQueryService">
 <task xmlns="http://xmlns.oracle.com/bpel/workflow/task">
 <title>task-identification-key</title>
 <ownerRole>task-identification-key.ProcessOwner</ownerRole>
 <priority>3</priority>
 <processInfo/>
 <systemAttributes> ... </systemAttributes>
 <systemMessageAttributes/>
 <identificationKey>35373030303632323333383139353637</identificationKey>
 <percentageComplete>100.0</percentageComplete>
 <sca>
 <compositeDN>default/task-identification-key!1.0*soa_.....</compositeDN>
 </sca>
 <applicationContext>OracleBPMProcessRolesApp</applicationContext>
 <taskDefinitionId>default/task-identification-key!1.0/htMyTask</taskDefinitionId>
 <mdsLabel>soa_...</mdsLabel>
 <customAttributes/>
 </task>
 </taskListResponse>
 </env:Body>
</env:Envelope>

Example / Sources

 

 
1 Comment

Posted by on 29-04-2016 in BPM, Oracle

 

Tags: , ,

Limitation in Oracle Adaptive Case Management (ACM) revision ID length

All our Oracle BPM projects use a revision id during deployment of the SCA component which is something like [4 digits].[svn-revision] which might look like 1602.71234

The Oracle SCA version format convention

In the Oracle documentation it states that the Oracle SCA composite revision must apply this format:
n0[.n1[.n2[.n3[.n4]]]][-milestone-name[milestone-number] | _patch-number]
Where all but “milestone-name” and “comment” are numeric, composed of one or more digits (0-9) from 0 up to a maximum value of 99999999.

This is the same convention you see on the error when deploying a composite with an incorrect revision format.

foutmelding_jdev

So we are good due to the fact that our revision naming standard only use n0.n1 and both numbers will not reach the max value of 99999999 anywhere soon.

The problem

However when testing we discovered that when our revision passed 99999 we have a problem. Not due to the normal SOA or BPM components, they can easily handle the longer n1 digits. But due to the fact that our Oracle ACM projects will throw the following error when deploying a composite with a total(!) revision length of 10+

Logging:

: Case metadata deployment failed. 
Case metadata deployment failed for MyCase. 
Contact system administrator for assistance. 
{rootCauses=[]} 
at oracle.bpm.casemgmt.fabric.CaseManagementServiceEngine.deploy(CaseManagementServiceEngine.java:1941) 
at oracle.bpm.casemgmt.fabric.CaseManagementServiceEngine.deploy(CaseManagementServiceEngine.java:401) 
at oracle.bpm.casemgmt.fabric.CaseManagementServiceEngine.deploy(CaseManagementServiceEngine.java:182) 
... 
Caused By: BPM-72806 
..... 
at java.lang.Thread.run(Thread.java:662) 
Caused By: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.1.v20111018-r10243): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLException: ORA-12899: value too large for column "SOA_SOAINFRA"."CM_CASE_DEFINITION"."COMPOSITE_VERSION" (actual: 12, maximum: 10)</pre>

So when checking the SOAINFRA database design we discovered that for ACM components the revision is also stored in a column with a definition of VARCHAR2(10)


DESC CM_CASE_DEFINITION
Name Null Type
----------------- -------- --------------
DEFINITION_ID NOT NULL VARCHAR2(400)
NAME NOT NULL VARCHAR2(255)
TITLE VARCHAR2(500)
DESCRIPTION VARCHAR2(1000)
CATEGORY VARCHAR2(400)
NAMESPACE VARCHAR2(2000)
COMPONENT_NAME VARCHAR2(200)
COMPOSITE_DN VARCHAR2(500)
COMPOSITE_NAME VARCHAR2(200)
COMPOSITE_VERSION VARCHAR2(10)
APPLICATION_NAME VARCHAR2(200)

table_soainfra

The solution

So we logged a service request (SR 3-12014738981) and together with Oracle Support we concluded that this is actually a bug in both 11g and 12c.
Bug 22564283 – Limitation in ACM revision ID due to CM_CASE_DEFINITION.COMPOSITE_VERSION

Yesterday we received confirmation from Oracle Support that the bug is fixed and we will receive a patch.
Meanwhile we can already use the workaround to update COMPOSITE_VERSION column in CM_ACTIVITY_DEFINITION and CM_CASE_DEFINITION to VARCHAR2(200).
So actually an easy fix on the SOAINFRA schema we assumed would work if we “hacked” it in our self, but we’re still very glad that it was quickly handled and solved through Oracle Support with an official supported patch.

alter table CM_ACTIVITY_DEFINITION modify (COMPOSITE_VERSION varchar2(200))
alter table CM_CASE_DEFINITION modify (COMPOSITE_VERSION varchar2(200))

So, if you run into the same problem you can refer with Oracle Support to the SR and BUG numbers mentioned above

 
Leave a comment

Posted by on 17-02-2016 in Uncategorized

 

Tags: , , , ,

Error in getting XML input stream with Oracle Business Rules 12.2.1

When trying to compile a Oracle ACM/BPM 12.2.1 project (with Oracle Business Rules) the following message throws up: “Error in getting XML input stream”

Jdev_Error

When Oracle Business Rules 12.2.1 generates it’s default XSD it uses the full system path instead of a relative path for it’s imports. So make sure to manually change the import configuration.

XSD_file

 
2 Comments

Posted by on 12-02-2016 in Oracle

 

Tags: , , ,

Oracle Service Bus 11g – Another session operation is in progress. Please retry later.

Since our Bamboo pipeline uses the same account for deployments we sometimes get this error “Another session operation is in progress. Please retry later.” during deployment.
So 1st of all, don’t use the same user (like weblogic) to deploy when your with a lot of developers / build pipelines / etc.
Time for us to use multiple users for each agent (or think of something else really smart), but in the meanwhile we sometimes have to discard the changes from an open session.

sbconsole -> View all Sessions -> Select session -> Discard all changes

2

1

However sometimes the sbconsole does not allow this action and we need to restart the Admin + Managed server.
Usually this fixes the issue, however this time it didn’t.

Luckily for us the great Pierluigi has a blog which tells us to clear the OSB domain session folder, so:

  • shutdown the Admin + Managed servers
  • clear all the SessionXXX folders in the ${DOMAIN_HOME}/osb/config/sessions
  • start the environment

The content of

[oracle@server sessions]$ ls -l
drwxr—–. 5 oracle oinstall 4096 Jan 13 13:22 SessionScript1452682586592
drwxr—–. 5 oracle oinstall 4096 Jan 13 13:22 SessionScript1452687725653
[oracle@server sessions]$ rm * -rf

References

 
Leave a comment

Posted by on 13-01-2016 in OSB

 

Tags: , ,

 
Follow

Get every new post delivered to your Inbox.

Join 458 other followers