how does "Unsatisfied Join" work

Hi all,

I am trying to understand the “Unsatisfied Join” transition type and I cannot even make my process going along such a transition. Anyone could bring some light into that? It would be much appreciated. Or maybe you got a sample?

Stefan

Hello Stefan,

you could have a look at the document 8-0-SP1_Administering_Process_Engine.pdf page 45. There is a description about how unsatified joins can occur.

I did not try to produce a unsatisfied join but I suspect you could do the following:

Try to join to parallel path with an AND join where the split is modelled in a way that only one of the parallel path are navigated at runtime. In this case you would have a join waiting for a transition that is not activated which would lead to a dead path as described in the documentation mentioned above.

Hope that helps.

Mathias

Hi,

I was not aware of this new document. It helps somewhat. The key here is that a join is only “not satisfied” if all transitions towards this join are actually evaluated but they are not executed due to a limiting condition of the transition.
That means all the preceding steps of the step with the join have to be executed and at least one of the transition has to fail due to a condition.

I got it working once this was clear to me. Unfortunately this is still not what I need. I am waiting in my process for document to arrive, once it arrives it will join the process. But if it never arrives the join should be “unblocked”. In order to achieve this I could have a unsatisfied join transition, but I would need to have the option to tell it, that this transition is basically unblocking every other AND condition. Basically I would need a more complex join like:

Join EQUALS true If ((transitionA=true AND transitionB=true) OR (transtionC=true))

I thought I can achieve something like this with the unsatisfied join, but this join will only happen if all transitions are at least evaluated.
So basically it works like that:
Join EQUALS true If (transitionA=true AND transitionB=true AND transtionC=false)

In my case I would still wait for transitionB because B never arrives and therefore my process will not finish.
This limitation is a bit strange as the wait will be blocked forever even though the unsatisfied join basically already happened and it makes no sense to wait for transitionB anymore because it will never satisfy the condition.

Stefan

Hi Stefan,

if I got you right you would like to implement a timeout on a receive step? I do not think “unsatisfied joins” can help you here.

I achieved such a behaviour using join timeouts an the receive step and a error transition. (Please see attached screenshot). The join timeout specifies the number of ms to wait for the document. If it does not arrive in time the transition with type error is navigated.

Hope that addresses your problem.

Mathias

Hi,

This was my first try. But I need a more complex process

  • start process
  • send doc to external system
  • wait for reply
    – if reply arrives on time → keep on going, finish process
    – if no doc arrives within 20 sec → timeout and create task
    – if doc arrives after 20 sec → close task if task is still not assigned and keep on going as it would have arrived on time
  • when task is solved → cancel the wait for reply and finish process

here you see that my wait step has 3 inputs

  • something to cancel the wait ( can’t do that)
  • reply doc
  • transition from send step

and it has 2 output transition

  • timeout
  • normal

Hi,

This was my first try. But I need a more complex process

  • start process
  • send doc to external system
  • wait for reply
    – if reply arrives on time → keep on going, finish process
    – if no doc arrives within 20 sec → timeout and create task
    – if doc arrives after 20 sec → close task if task is still not assigned and keep on going as it would have arrived on time
  • when task is solved → cancel the wait for reply and finish process

here you see that my wait step has 3 inputs

  • something to cancel the wait ( can’t do that)
  • reply doc
  • transition from send step

and it has 2 output transition

  • timeout
  • normal

Hi,

This was my first try. But I need a more complex process

  • start process
  • send doc to external system
  • wait for reply
    – if reply arrives on time → keep on going, finish process
    – if no doc arrives within 20 sec → timeout and create task
    – if doc arrives after 20 sec → close task if task is still not assigned and keep on going as it would have arrived on time
  • when task is solved → cancel the wait for reply and finish process

here you see that my wait step has 3 inputs

  • something to cancel the wait ( can’t do that)
  • reply doc
  • transition from send step

and it has 2 output transition

  • timeout
  • normal

That’s a hard one.

I thought about it for a bit because it is in interesting problem. I tried a solution without unsatisfied links because I think you can solve the problem using normal modelling.

The trick in my solution (see screenshot) is to use two receives which do the same - the first times out after 20 seconds - the second after 2m40s (so 3 minutes in total).

The terminate step is specified using “unsynchronized or” join - so the process would finish when the first transition comes in the terminate step.

The only thing that is not covered is that the task should only be killed when it is not assigned. But you could have an integration server service to check this before terminating the process.

Would that be a solution?
2010-11-24_screencapture_04.jpg

It would be nice if that would work.
But the problem is that I do not have a timeout for the retry and in case the reply arrives on time the “receive step first try” and “receive 3” will be triggered and of course in reality there are services after the receive and they most not be executed more than once.
Also, the retry should only give up when the manual task was performed.

I know it is a hard one. I’ll let you know when I find a solution. If you want I can send you the functional design ( one page) of this model. I really causes some headache.
Our design pattern requires to finish a process without a terminate step, but I think this is something I must use in this case.

Thanks for the ideas.
Stefan

I think I found a way of making it as a model. Feel free to have a look at the attached model.
I collapsed the timeout functions to make it easier understandable for the business. It has a lot of loops but should work.
TimeOut2.zip (4.53 KB)