Hi Justin, That’s exactly where I was going with that analogy. The equivalent of service.ranking for plumbers would presumably be their Yelp rating. And if you have multiple plumbers all with 5-star reviews then just pick any, it doesn’t matter!
Neil > On 22 Jul 2017, at 14:04, Justin Edelson <jus...@justinedelson.com> wrote: > > Obviously you should pick the plumber with the highest service.ranking. > > Sorry, couldn't resist. > > On Sat, Jul 22, 2017 at 7:39 AM Neil Bartlett <njbartl...@gmail.com > <mailto:njbartl...@gmail.com>> wrote: > I'm not talking at all about multiple versions of the same jar. I'm talking > about multiple providers of the same service, possibly even from different > vendors. This happens just as easily under Service Loader as under OSGi. > > In your original email you asked: why does the consumer of PNG have to care > which PNG provider to choose. Well isn't that just a fact of life? I need a > plumber to fix my toilet... there are ten plumbers in my town, which should I > choose? Why do I have to care about plumbers?! > > Having choices can suck, but not as much as having no choice. > > Neil > > On 22 Jul 2017 10:44 am, "Mark Raynsford" <list+org.o...@io7m.com > <mailto:list%2borg.o...@io7m.com>> wrote: > On 2017-07-22T00:22:31 +0100 > Neil Bartlett <njbartl...@gmail.com <mailto:njbartl...@gmail.com>> wrote: > > > Hello Mark, > > 'Ello. > > > > > Tell me, why is this problem any harder under OSGi than with > > ServiceLoader?? In both cases, anybody can install a bundle or a JAR that > > provides a service with a name, and those names can collide. > > In Java < 9, it's not so much that it can't happen, but more that > having two different versions of the same jar file on the classpath is > considered a mistake, and build tools like Maven will (via the Enforcer > plugin) try to prevent that from happening. In Java 9, it's explicitly > an error for two modular jars in the same ModuleLayer to export the > same package, so the program won't even start up if you try it. In > OSGi, having multiple versions of a bundle installed and running is not > considered an error (although it's probably not exactly encouraged > either), so the hypothetical ImageFormats class that tracks providers > by name would give inconsistent results in that situation. > > > In both ServiceLoader and OSGi there is a simple rule for selecting a > > single instance of a service where many are available. Under ServiceLoader > > it is just the first JAR on the classpath. With OSGi you can attach a > > service.ranking property to any service. This can be done by the developer > > of the service, or supplied/overridden at runtime using Config Admin. Note > > that even with service.ranking, it is possible to have multiple service > > with the same high ranking. In this case OSGi picks the service with the > > lowest service.id <http://service.id/>, which in effect usually means the > > one that was registered first. > > Yes, I'm aware. As I mentioned in the other message to this list, using > the service ranking and ID would *probably* be fine given a very > long-running framework instance, because the ordering of service.id > <http://service.id/> will > most likely reflect the order in which a given set of bundle versions > were installed. However, if you start up a new framework instance with > a set of bundles already in the bundle cache, there's nothing that > guarantees that the older bundle versions will get lower service IDs, > right? > > > By the way it is generally bad practice to provide a service name via a > > method on the service interface. Better to add this as a property to the > > service metadata, so that it can be selected using declarative filters. For > > example: > > > > @Component(property = “name=JPEG”) > > public class JPEGImageFormat implements ImageFormat { … } > > > > @Component > > public class PaintProgram { > > @Reference(target = “(name=JPEG)”) > > ImageFormat formatter; > > // ... > > } > > I'd tend to agree, but I did make this point: > > > Sometimes, though, a class analogous to ImageFormats > > is necessary, particularly when you expect callers to be OSGi-unaware > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > and/or you only have very simple selection criteria (like a "PNG" > > string). > > In other words, if you're writing code that is expected to work both > when running in an OSGi framework and when running on the classpath or > module path, you may want/need to abstract over the registration of > ImageFormats. In other words, you might want to provide a hypothetical > ImageFormatRegistry interface that _both OSGi and non-OSGi consumers_ > can make calls into to find image formats (to avoid having to write > one code path for OSGi, and one code path for everyone else). Outside of > OSGi, the best-practice rules for Java < 9 make multiple registrations > of an ImageFormat less likely. The strict Java 9 rules regarding > conflicting package exports make multiple registrations impossible, at > least when those registrations come from two different versions of the > same modular jar. In an OSGi framework, however, the situation is > slightly more permissive than the Java < 9 case; multiple installed > versions of a bundle are a reality, and complicate the implementation of > ImageFormatRegistry class. > > -- > Mark Raynsford | http://www.io7m.com <http://www.io7m.com/> > _______________________________________________ > OSGi Developer Mail List > osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> > https://mail.osgi.org/mailman/listinfo/osgi-dev > <https://mail.osgi.org/mailman/listinfo/osgi-dev>_______________________________________________ > OSGi Developer Mail List > osgi-dev@mail.osgi.org > https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org https://mail.osgi.org/mailman/listinfo/osgi-dev