Decision making in jBPM 5.4 - jboss

I'm new to jBPM 5.4 and and also to the BPM work-flow genre.
I have a simple requirement to submit a product and a concerned supervisor needs to accept or reject it.
Based on the decision made, flows in a different path.
No
------------ State A
Approval -------------|
------------ State B
Yes
This is the simple work-flow needed to be implemented.
My question is the "Approval" must be performed by a user.
How to simulate such a human task in jBPM 5.0 with eclipse tooling.
Also how to upload this proj to jBPM console and programatically invoke the flow.
Thanks in advance.

You should use a user task to model the approval request, and use a result mapping to map the answer to a process variable. You can then use this variable in for example an exclusive gateway to make a decision based on the response of the user.
There is an example in the jbpm-examples module that does something similar: use a human task to ask for approval:
https://github.com/droolsjbpm/jbpm/blob/master/jbpm-examples/src/main/resources/humantask/HumanTask.bpmn
Kris

In web Designer, the conditions are not set in the gateway but in each of its outgoing flows.
What you need to do it to click on one of the outgoing flows, and in its "Conditional Expression" attribute write:
return approval == true;
Make sure that "Contitional Expression Language" is set to 'java'
Repeat the steps for the second flow.
Ref:
https://community.jboss.org/thread/204303

Related

Tracking in progress cadence workflow by client

Let's say we need to generate the order after the user finalized his/her cart.
This is our steps to generate order:
generate an order in pending state (order microservice)
authorize user's credit(accounting microservice)
set status of the cart to closed(cart microservice)
approve the order (order microservice)
To do this we simply create a cadence workflow that calls to an activity for each step.
problem1: how the client can detect that the order creation is in progress for that cart if the user opens the cart again or refresh the page?
(Note: assume our workflow is not executed by the worker yet)
My Solution for problem 1: create order and change its status to pending before running the workflow, so for the next requests, the client knows that the order is in pending status. but what happens if order creation was successful, but start workflow failed? it's not transactional (order creation and workflow run)
If this solution is your solution also and you accept its risk, tell me please. I'm new to cadence.
Problem 2: How to inform the client after the workflow has done and the order is ready?
Any solution or article or help, please?
Problem 1 : There are multiple solutions to consider:
1.1 Add a step in the workflow to change the order to pending state, before calling order microservice, instead of doing it outside of workflow. It will save you from the issue of consistency, you can add retry in the workflow to make sure the state are eventually consistent.
1.2 Add a query method to query the workflow state, and User/UI can make queryWorkflow call to retrieve the workflow state to see the order status.
1.3 Put the state into SearchAttribute of the workflow, and User/UI can make describeWorkflow call to get the state
1.4. After https://github.com/uber/cadence/issues/3729 is implemented, you can use memo instead of SearchAttribute like 1.3
Comparison: 1.1 is the choice if you think order storage is the source of truth of order state, 1.2~1.4 will make workflow become source of truth. It really depends on how you want to design the system architecture.
1.2 may not be a good choice if User/UI expects low latency. Because QueryCall may take a few seconds to return.
1.3~1.4 will be much more performant/fast. It only requires Cadence server make a DB call to get the workflow state.
1.3 has another benefit if you have Advanced visibility enabled with ElasticSearch+Kafka setup -- you can search/filter/count workflows by order states. But the limitation of 1.3 is that you should only put very small data like a string/integer, not a blob of state.
The benefit of 1.4 is that you could put a blob of state.
To prevent user finalizing a cart multiple times:
When starting workflow, use a stable workflowID associated to the cart. So that you can call describeWF before allowing them to finalize/checkout a cart. The workflow is persisted once the StartWF req is accepted.
If there is an active workflow(not failed/completed/timeouted), it means the cart is pending. For example if a cart uses a UUID, then you can use that UUID+prefix to make workflowID. Cadence guarantees workflowID uniqueness so there will be no race condition of starting two workflows for the same cart. If a checkout failed then a user can submit the checkout workflow again.
Problem 2 : It depends on what you want by "inform". The term inform sounds like asynchronous notification. If that's the case you can have another activity to send the notification to another microservice, or send a signal to another workflow that need the notification.
If here you means synchronous manner like showing on a WebUI, then it can be solved the same way as in the solutions I mentioned for problem 1.

GeneXus GXFlow's flow that generate multiple instances

I'm developing a workflow with GeneXus GXFlow.
It's a purchase request that needs multiple approval. I don't know how many, it depends by the type of products. The request is approved only when all the products are approved.
I think that the only way to do that is a process instance that generates multiple process instances of a child workflow.
Is it possibile? Where I can find an example?
Creating multiple process instances might be a solution but there is a more efficient way to do it with multi-instance tasks.
Check out the documentation for the Loop Type property to see how to configure it:
https://wiki.genexus.com/commwiki/servlet/wiki?11898,Loop+type+property

Avoid multiple Instances in workflow Ax2009

Whenever the user submits a workflow request from Enterprise portal clicking more than once, multiple instances are generated. Kindly suggest a way to avoid as it is misleading.
Thank you.
Have a look here
In the event this.WorkflowActionBar.EvaluatingCanSubmitToWorkflow you could via the EP's Business Connector session call a static method in X++ to check whether a workflow for your current process / document / whatever already exists and avoid submitting it again. How you determine that of course depends on your environment / process etc.

Sparx EA - How to capture event (e.g. status change)

Is there an automated way to detect when a requirement's status is set to 'Approved'? The business need is to alert an external app each time a requirement is approved.
One option is to to build an add-in for Enterprise Architect. I wrote some articles about that subject that should help you get started.
In this add-in you can implement the "events" EA_ConContextItemChanged to capture the status before it was changed and EA_OnNotifyContextItemModified to compare it with the previously captured status.
It might be possible that you can also use workflow scripts, but I'm not sure (nobody really uses that).

Can Microsoft Windows Workflow route to specific workstations?

I want to write a workflow application that routes a link to a document. The routing is based upon machines not users because I don't know who will ever be at a given post. For example, I have a form. It is initially filled out in location A. I now want it to go to location B and have them fill out the rest. Finally, it goes to location C where a supervisor will approve it.
None of these locations has a known user. That is I don't know who it will be. I only know that whomever it is is authorized (they are assigned to the workstation and are approved to be there.)
Will Microsoft Windows Workflow do this or do I need to build my own workflow based on SQL Server, IP Addresses, and so forth?
Also, How would the user at a workstation be notified a document had been sent to their machine?
Thanks for any help.
I think if I was approaching this problem workflow would work to do it. It is a state machine you want that has three states:
A Start
B Completing
C Approving
However workflow needs to work in one central place (trust me on this, you only want to have one workflow run time running at once, otherwise the same bit of work can be done multiple times see our questions on MSDN forum). So a central server running the workflow is the answer.
How you present this to the users can be done in multiple ways. Dave suggested using an ASP.NET site to identify the machines that are doing the work, which is probably how I would do it. However you could also write a windows forms client that would do the same thing. This would require using something like SOAP / WCF to facilitate communication between client form applications and the central workflow service. This would have the advantage that you could use a system try icon to alert the user.
You might also want to look at human workflow engines, as they are designed to do things such as this (and more), I'm most familiar with PNMsoft's Sequence
You can design a generic "routing" workflow that will cause data to go to a workstation. The easiest way to do this would be to embed the workflow in an ASP.NET application. Each workstation should visit the application with a workstation ID in the querystring:
http://myapp/default.aspx?wid=01
When the form is filled out at workstation A, the workflow running in the web app can enter it into the "work bin" of the next workstation. Anyone sitting at the computer for which the form is destined will see it appear in their list of forms to review. You can use AJAX to make it slick and auto-updating.