A really elegant solution to these problems is to use a Promise …
1) Create a Deferrred
2) Execute your item code through the promise of the deferred
3) When the Executor reference is set, you resolve the deferred
@Component
public class Foo {
Deferred<Executor> deferred = new Deferred<>();
@Reference
void setExecutor( Executor e) { deferred.resolve(e); }
@Reference( multiple/dynmaic)
void addItem( Item item) {
deferred.getPromise().thenAccept ( executor -> … )
}
}
This will automatically process your items after the executor is set. It think
it also easily extends to multiple dependencies but would have to puzzle a bit.
If you’re unfamiliar with Promises, I’ve written an app note, ehh blog,
recently about 1.1 Promises http://aqute.biz/2018/06/28/Promises.html
<http://aqute.biz/2018/06/28/Promises.html>. They really shine in these
ordering issues.
Kind regards,
Peter Kriens
> On 18 Jul 2018, at 00:16, David Leangen via osgi-dev <[email protected]>
> wrote:
>
>
> Hi!
>
> I have a component that acts a bit like a whiteboard provider. It looks
> something like this:
>
> public class MyWhiteboard
> {
> boolean isActive;
>
> @Reference MyExecutor executor; // Required service to execute on an Item
>
> @Reference(multiple/dynamic)
> void bindItem( Item item )
> {
> if (isActivated)
> // add the Item
> else
> // Store the item to be added once this component is activated
> }
>
> void unbindItem( Item item )
> {
> // Remove the item
> }
>
> @Activate
> void activate()
> {
> // execute non-processed Items
> isActivate = true;
> }
> }
>
> The MyExecutor must be present before an Item can be processed, but there is
> no guarantee as to the binding order. All I can think of doing is ensuring
> that the Component is Activated before processing.
>
> My question is: is there a more elegant / simpler / less error prone way of
> accomplishing this?
>
>
> Thanks!
> =David
>
>
> _______________________________________________
> OSGi Developer Mail List
> [email protected]
> https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev