@ProviderType public interface Coordinator
A bundle can use the Coordinator service to create Coordination
objects. Once a Coordination object is created, it can be
pushed
on the thread local Coordination stack to
be an implicit parameter as the current Coordination for calls to other
parties, or it can be passed directly to other parties as an argument. The
current Coordination, which is on the top of the current thread's thread
local Coordination stack, can be obtained with peek()
.
Any active Coordinations created by a bundle must be terminated when the
bundle releases the Coordinator service. The Coordinator service must
fail
these Coordinations with the
RELEASED
exception.
A Participant
can register
to participate in a Coordination and receive notification of the
termination of the Coordination.
The following example code shows a example usage of the Coordinator service.
void foo() { Coordination c = coordinator.begin("work", 0); try { doWork(); } catch (Exception e) { c.fail(e); } finally { c.end(); } }In the
doWork
method, code can be called that requires notification
of the termination of the Coordination. The doWork
method can then
register a Participant with the Coordination.
void doWork() { if (coordinator.addParticipant(this)) { beginWork(); } else { beginWork(); finishWork(); } } void ended(Coordination c) { finishWork(); } void failed(Coordination c) { undoWork(); }
Modifier and Type | Method and Description |
---|---|
boolean |
addParticipant(Participant participant)
Register a Participant with the
current Coordination . |
Coordination |
begin(java.lang.String name,
long timeMillis)
Create a new Coordination and make it the
current
Coordination . |
Coordination |
create(java.lang.String name,
long timeMillis)
Create a new Coordination.
|
boolean |
fail(java.lang.Throwable cause)
Terminate the
current Coordination as a failure with the
specified failure cause. |
Coordination |
getCoordination(long id)
Returns the Coordination with the specified id.
|
java.util.Collection<Coordination> |
getCoordinations()
Returns a snapshot of all active Coordinations.
|
Coordination |
peek()
Returns the current Coordination.
|
Coordination |
pop()
Remove the current Coordination from the thread local Coordination stack.
|
Coordination create(java.lang.String name, long timeMillis)
name
- The name of this coordination. The name does not have to be
unique but must follow the symbolic-name
syntax from the
Core specification.timeMillis
- Timeout in milliseconds. A value of 0 means no timeout
is required. If the Coordination is not terminated within the
timeout, the Coordinator service will
fail
the Coordination with a
TIMEOUT
exception.java.lang.IllegalArgumentException
- If the specified name does not follow
the symbolic-name
syntax or the specified time is
negative.java.lang.SecurityException
- If the caller does not have
CoordinationPermission[INITIATE]
for the specified name
and creating bundle.Coordination begin(java.lang.String name, long timeMillis)
current
Coordination
.
This method does that same thing as calling create(name, timeMillis)
.push()
name
- The name of this coordination. The name does not have to be
unique but must follow the symbolic-name
syntax from the
Core specification.timeMillis
- Timeout in milliseconds. A value of 0 means no timeout
is required. If the Coordination is not terminated within the
timeout, the Coordinator service will
fail
the Coordination with a
TIMEOUT
exception.java.lang.IllegalArgumentException
- If the specified name does not follow
the symbolic-name
syntax or the specified time is
negative.java.lang.SecurityException
- If the caller does not have
CoordinationPermission[INITIATE]
for the specified name
and creating bundle.Coordination peek()
The current Coordination is the Coordination at the top of the thread local Coordination stack. If the thread local Coordination stack is empty, there is no current Coordination. Each Coordinator service maintains thread local Coordination stacks.
This method does not alter the thread local Coordination stack.
null
if the thread local
Coordination stack is empty.Coordination pop()
The current Coordination is the Coordination at the top of the thread local Coordination stack. If the thread local Coordination stack is empty, there is no current Coordination. Each Coordinator service maintains its own thread local Coordination stacks.
This method alters the thread local Coordination stack, if it is not empty, by removing the Coordination at the top of the thread local Coordination stack.
null
if the thread local Coordination stack is empty.java.lang.SecurityException
- If the caller does not have
CoordinationPermission[INITIATE]
for the current
Coordination.boolean fail(java.lang.Throwable cause)
current Coordination
as a failure with the
specified failure cause.
If there is no current Coordination, this method does nothing and returns
false
.
Otherwise, this method returns the result from calling
Coordination.fail(Throwable)
with the specified failure cause on
the current Coordination.
cause
- The failure cause. The failure cause must not be
null
.false
if there was no current Coordination, otherwise
returns the result from calling
Coordination.fail(Throwable)
on the current Coordination.java.lang.SecurityException
- If the caller does not have
CoordinationPermission[PARTICIPATE]
for the current
Coordination.Coordination.fail(Throwable)
boolean addParticipant(Participant participant)
current Coordination
.
If there is no current Coordination, this method does nothing and returns
false
.
Otherwise, this method calls
Coordination.addParticipant(Participant)
with the specified
Participant on the current Coordination and returns true
.
participant
- The Participant to register with the current
Coordination. The participant must not be null
.false
if there was no current Coordination, otherwise
returns true
.CoordinationException
- If the Participant could not be registered
with the current Coordination. This exception should normally not
be caught by the caller but allowed to be caught by the initiator
of this Coordination.java.lang.SecurityException
- If the caller does not have
CoordinationPermission[PARTICIPATE]
for the current
Coordination.Coordination.addParticipant(Participant)
java.util.Collection<Coordination> getCoordinations()
Since Coordinations can be terminated at any time, Coordinations in the returned collection can be terminated before the caller examines the returned collection.
The returned collection must only contain the Coordinations for which the
caller has CoordinationPermission[ADMIN]
.
Coordination getCoordination(long id)
id
- The id of the requested Coordination.null
if no
Coordination with the specified id exists, the Coordination with
the specified id is terminated
or the caller does not have
CoordinationPermission[ADMIN]
for the Coordination with
the specified id.Copyright © OSGi Alliance (2000, 2018). All Rights Reserved. Licensed under the OSGi Specification License, Version 2.0