You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@river.apache.org by Oliver Plohmann <ol...@objectscape.org> on 2010/08/19 00:29:35 UTC

Entry takeAny(Collection templates, Transaction, timeout)

Hello,

I need something like a JavaSpaces method with this signature:

Entry takeAny(Collection templates, Transaction, timeout);

A single entry is returned as soon as any entry written to the space 
matches one of the templates specified in the invocation of takeAny. The 
reason I would like to have things this way is that I want to use actors 
in conjunction with a tuple space. An actor supports a set of functions 
which are mapped by tuple space templates. Let's say some specific actor 
must only process messages A, B, and C. At the beginning any of these 
three messages may be consumed. From that point on the order A->B->C 
must be kept. So, when activated after startup the actor does a takeAny 
on A,B, and C. First, by chance, a B is consumed. Because of the 
execution order, the actor must only consume a C next. For that reason, 
after B has been processed, the actor does a takeAny with C as the 
single templates element. This is only a sample scenario to point out 
that after a message has been consumed by the actor, for the following 
call of takeAny the collection for the templates parameter must 
eventually be re-created by the actor. This is what creates the problem. 
Otherwise, one could use JavaSpaces05.registerForAvailabilityEvent or 
notify and things would be fine.

My question is now how to solve this problem in an appropriate way. My 
first thought was to call takeIfExists in a loop. But what to do in case 
every call to takeIfExists in the loop returns null? Then I need to go 
with JavaSpaces05.registerForAvailabilityEvent. The actor simply ignores 
the event if it doesn't contain the template of the entry to be 
processed next. In that case I fear that the system would be flooded 
with event notifications degrading performance.

To use Collection take(Collection tmpls, ...) would not be a good idea, 
because I would have to re-insert the entries that are not to be 
processed next. The best solution I have come up with so far is to call 
notify in a loop for all functions the actor supports when the actor is 
started. Whenever the specified RemoteEventListener is called, I decide 
according to the handback object whether the added entry is in the 
actor's current respondsTo function set. If not the event is ignored and 
some other actor may consume the entry. Again, I fear this may result in 
the system being flooded with event notifications creating an avalanche 
of events that plaster the network.

Maybe some of the JavaSpaces professionals out there have a better idea 
how to do this or might know whether the fear of system performance 
degradation when using notify is exaggerated.

Thanks a lot for any ideas.
Cheers, Oliver Plohmann


www.objectscape.org



-- 

www.objectscape.org


RE: Entry takeAny(Collection templates, Transaction, timeout)

Posted by Shay Hassidim <sh...@gigaspaces.com>.
Oliver,



See:

http://www.gigaspaces.com/wiki/display/SBP/Unit+Of+Work



You can use our community edition for free.



Shay Hassidim

Deputy CTO

GigaSpaces



-----Original Message-----
From: Oliver Plohmann [mailto:oliver@objectscape.org]
Sent: Wednesday, August 18, 2010 6:30 PM
To: river-user@incubator.apache.org
Subject: Entry takeAny(Collection templates, Transaction, timeout)



Hello,



I need something like a JavaSpaces method with this signature:



Entry takeAny(Collection templates, Transaction, timeout);



A single entry is returned as soon as any entry written to the space

matches one of the templates specified in the invocation of takeAny. The

reason I would like to have things this way is that I want to use actors

in conjunction with a tuple space. An actor supports a set of functions

which are mapped by tuple space templates. Let's say some specific actor

must only process messages A, B, and C. At the beginning any of these

three messages may be consumed. From that point on the order A->B->C

must be kept. So, when activated after startup the actor does a takeAny

on A,B, and C. First, by chance, a B is consumed. Because of the

execution order, the actor must only consume a C next. For that reason,

after B has been processed, the actor does a takeAny with C as the

single templates element. This is only a sample scenario to point out

that after a message has been consumed by the actor, for the following

call of takeAny the collection for the templates parameter must

eventually be re-created by the actor. This is what creates the problem.

Otherwise, one could use JavaSpaces05.registerForAvailabilityEvent or

notify and things would be fine.



My question is now how to solve this problem in an appropriate way. My

first thought was to call takeIfExists in a loop. But what to do in case

every call to takeIfExists in the loop returns null? Then I need to go

with JavaSpaces05.registerForAvailabilityEvent. The actor simply ignores

the event if it doesn't contain the template of the entry to be

processed next. In that case I fear that the system would be flooded

with event notifications degrading performance.



To use Collection take(Collection tmpls, ...) would not be a good idea,

because I would have to re-insert the entries that are not to be

processed next. The best solution I have come up with so far is to call

notify in a loop for all functions the actor supports when the actor is

started. Whenever the specified RemoteEventListener is called, I decide

according to the handback object whether the added entry is in the

actor's current respondsTo function set. If not the event is ignored and

some other actor may consume the entry. Again, I fear this may result in

the system being flooded with event notifications creating an avalanche

of events that plaster the network.



Maybe some of the JavaSpaces professionals out there have a better idea

how to do this or might know whether the fear of system performance

degradation when using notify is exaggerated.



Thanks a lot for any ideas.

Cheers, Oliver Plohmann





www.objectscape.org







--



www.objectscape.org