Hello,

On Sat, Jul 28, 2012 at 09:39:01AM -0700, emc_lab wrote:
>
> Hopefully this is something I am doing wrong. I am using ruote within rails
> 3.1, once I create a new model entry (e.g blog), next I create a new
> workitem for this blog,

You launch a new process instance related to this blog instance I guess.


> then at last (in the same thread), I do (@workitems
> = RuoteKit.storage_participant.all) to get all outstanding workitems to
> display them in a form. I notice the list of workitems is always missing
> the latest new workitem I just added. I think I know that ruote worker will
> spawn new thread to handle this new workitem creation. Is there a way I can
> configure the worker to process this creation within the same thread?

The ruote worker will not spawn a new thread to handle "the new workitem
creation". The workitem is created in the same thread where you called
RuoteKit.engine.launch(). The workitem execution is happening in the worker's
own thread which was spawned when the worker was instantiated.

The worker cannot be told to run in the same thread, because well, ruote is
meant to support multiple process instances running in an interleaved way
(seemingly concurrently), the worker thread executes all the workflows.

If you extend your architecture with multiple workers, your workflow
execution will even happen in other Ruby runtimes.


> or is there a work around? Thanks much for any help.

You could do (if you're using ruote 2.3.0 from github directly)

  RuoteKit.engine.wait_for('dispatched')
  @workitems = RuoteKit.storage_participant.all

or something like (any ruote)

  sleep 0.350
  @workitems = RuoteKit.storage_participant.all

But none of those two are guaranteed.

The first one will wait for any "dispatched" event, it means that if someone,
in another web requests is creating a blog entry too, the "dispatched" might
be for his workflow, not yours (you won't see the workitem).

The second one will wait for 0.350s, then, the workitem will be part of the
"all", maybe not. If the system is busy, the process of the flow by the
worker could take more than 0.350s and the workitem won't be seen...

...

Variants of this question have popped up in this forum quite often. People
who really needed to be notified immediately of a workitem coming up in a
workbox usually resorted to things like websockets... server to client
notifications.

Ruote is meant to do work on its own and then come back to the user via a
participant (storage participant usually). Forcing ruote in a synchronous
beat is a bit counter-productive.

Ah, anyway... There is a third way:

  300.times do
    sleep 0.010 # 3 seconds max
    @workitems = RuoteKit.storage_participant.all
    break if @workitems.find { |wi| wi.fields['x'] == 'y' }
  end

Not guaranteed either (if the flow takes more than ~3s to reach the storage
participant) but a bit more precise (we verify via @workitems.find{} that the
workitem is the right one).


I hope this will help, best regards,

--
John Mettraux - http://lambda.io/jmettraux

-- 
you received this message because you are subscribed to the "ruote users" group.
to post : send email to [email protected]
to unsubscribe : send email to [email protected]
more options : http://groups.google.com/group/openwferu-users?hl=en

Reply via email to