[
https://issues.apache.org/jira/browse/SLING-2575?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Alexander Klimetschek updated SLING-2575:
-----------------------------------------
Attachment: SLING-2575-ServiceReferences.patch
Patch that adds a ServiceReferences class:
* follows mostly the proven approach of the SlingPostServlet
* thread-safety should be ensured (especially through the cached "objects"
list), but please review this
* works only with osgi >= 4.1 as it relies on ServiceReference implementing the
Comparable interface for the service ranking order (and by id if equal)
Here is sample code how you would use this (also in the javadoc):
@Reference(name = "myService", referenceInterface = MyService.class,
cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy =
ReferencePolicy.DYNAMIC)
private ServiceReferences<MyService> myServices = new
ServiceReferences<MyService>("myService");
protected void activate(ComponentContext context) {
myServices.activate(context);
}
protected void deactivate(ComponentContext context) {
myServices.deactivate();
}
protected void bindMyService(ServiceReference provider) {
myServices.bind(provider);
}
protected void unbindMyService(ServiceReference provider) {
myServices.unbind(provider);
}
private void doSomething() {
MyService highest = myServices.first();
// ...
for (MyService s: myServices.get()) {
// ...
}
}
> Utility for tracking a multi-cardinality OSGi service reference
> ---------------------------------------------------------------
>
> Key: SLING-2575
> URL: https://issues.apache.org/jira/browse/SLING-2575
> Project: Sling
> Issue Type: Improvement
> Components: Commons
> Reporter: Alexander Klimetschek
> Priority: Minor
> Attachments: SLING-2575-ServiceReferences.patch
>
>
> Managing a SCR @Reference that's basically a list is very difficult when
> compared to the simple unary, static reference. It seems a typical use case
> is 0..n cardinality, dynamic policy and ordered by service ranking with the
> higher ranked ones first. This supports the use case to ask a list of
> services and have the first responding one win.
> There is the ServiceTracker [0], but its getServiceReferences() method does
> not return the list sorted in any way, only gives your references and not the
> typed object(s) and it's a bit cumbersome to use.
> A typical manual approach can be seen in the SlingPostServlet [1] in the
> register*() methods. Important is to handle thread-safeness.
> [0]
> http://www.osgi.org/javadoc/r4v42/org/osgi/util/tracker/ServiceTracker.html
> [1]
> http://svn.apache.org/repos/asf/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/SlingPostServlet.java
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira