Not sure this will actually help with OSGi in terms of auto-discovery at all after thinking about it some more. The problem is that in order for auto-discovery to happen, Hibernate would need to have visibility into the jar defining the service anyway in order to auto-discovery it.
On the bright side, I realized another benefit. It would finally be possible to report the available types of a particular service/strategy. For example, show me all the available ConnectionProviders; all the available Dialects; etc... On Fri 24 Aug 2012 08:51:09 PM CDT, Steve Ebersole wrote: > Would be nice to consolidate the notions of > "ServiceAvailabililtyNotifier" and "ServiceContributor" (that I just > added on metamodel). Such that a ServiceContributor would be able to > regsiter the short names as well. > > > On Thu 23 Aug 2012 03:58:10 PM CDT, Steve Ebersole wrote: >> Ok, going to start working this up on master tomorrow. We will just >> tackle the "going away" problem if/when it actually arises. >> >> On Tue 21 Aug 2012 05:55:31 PM CDT, Steve Ebersole wrote: >>> Everyone else ok with this idea? >>> >>> On Tue 21 Aug 2012 08:27:25 AM CDT, Steve Ebersole wrote: >>>> Not so concerned about shutdown situations. >>>> >>>> More, imagine a custom ConnectionProvider implementation provided by >>>> user. And the use case of upgrading that implementation "in flight". >>>> I think thats the OSGi use case. And not so sure Hibernate should be >>>> implementing this self healing. I guess it depends how deeply we want >>>> to support the OSGi model above and beyond JSE/JEE >>>> >>>> Obviously a used ConnectionProvider just going away is going to render >>>> the SessionFactory using it broken. >>>> >>>> On Tue 21 Aug 2012 08:22:11 AM CDT, Scott Marlow wrote: >>>>> On 08/20/2012 11:19 PM, Steve Ebersole wrote: >>>>>> This ties together a few different discussions that have been >>>>>> going on >>>>>> simultaneously on the mailing list that I think are all related. >>>>>> >>>>>> Right now to configure certain services (select one impl over >>>>>> another) >>>>>> users generally give the FQN for that impl Class. For example to >>>>>> use >>>>>> C3P0 connection pooling users would say: >>>>>> >>>>>> hibernate.connection.provider_class = >>>>>> org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider >>>>>> >>>>>> >>>>>> >>>>>> We have discussed why this is bad even before any of the OSGi >>>>>> discussions and the solution we wanted to shoot for was that of >>>>>> naming >>>>>> "selectors" such that the user would instead say: >>>>>> >>>>>> hibernate.connection.provider_class = c3p0 >>>>>> >>>>>> And "c3p0" here would be interpreted to mean "instantiate and >>>>>> configure >>>>>> the >>>>>> org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider >>>>>> >>>>>> >>>>>> Class". But that still means a limited set of short name values >>>>>> *and* >>>>>> still gives us a problem (iiuc) under OSGi due to visibility. >>>>>> >>>>>> So what I propose instead is a way for service implementors to be >>>>>> registered under a short name via discovery. The main piece to >>>>>> this is >>>>>> the "registry" (which is also a service under the >>>>>> BootstrapServiceRegistry): >>>>>> >>>>>> interface AvailableServiceRegistry extends Service { >>>>>> public <T> Class<? extends T> >>>>>> findAvailableServiceImplementor(Class<T> serviceRole, String >>>>>> selector); >>>>>> } >>>>>> >>>>>> class AvailableServiceRegistryImpl >>>>>> implements AvailableServiceRegistry, >>>>>> ServiceRegistryAwareService { >>>>>> private Map<Class,Map<String,Class>> availableImplementors = >>>>>> ...; >>>>>> >>>>>> @Override >>>>>> public <T> Class<? extends T> >>>>>> findAvailableServiceImplementor(Class<T> serviceRole, String >>>>>> selector) { >>>>>> // purposely simplistic :) >>>>>> return availableImplementors.get( serviceRole ).get( >>>>>> selector ); >>>>>> } >>>>>> >>>>>> @Override >>>>>> public void injectServices(ServiceRegistryImplementor >>>>>> serviceRegistry) { >>>>>> final LinkedHashSet<ServiceAvailabililtyNotifier> >>>>>> notifiers = >>>>>> serviceRegistry.getService( ClassLoaderService.class >>>>>> ).loadJavaServices( >>>>>> ServiceAvailabililtyNotifier.class ); >>>>>> for ( ServiceAvailabililtyNotifier notifier : notifiers >>>>>> ) { >>>>>> for ( ServiceAvailabililty availability : >>>>>> notifier.getAvailabilities() ) { >>>>>> // again, purposely simplistic >>>>>> Map<String,Class> serviceImplementors = >>>>>> availableImplementors.get( availability.getRole() ); >>>>>> serviceImplementors.put( >>>>>> availability.getSelector(), >>>>>> availability.getImplementor() >>>>>> ); >>>>>> } >>>>>> } >>>>>> } >>>>>> } >>>>>> >>>>>> >>>>>> >>>>>> Outstanding question... Especially in OSGi, where service bundles >>>>>> can be >>>>>> added/removed, how do we best account for cleaning up no-longer >>>>>> valid >>>>>> references (even more importantly perhaps, what the hell does it >>>>>> mean to >>>>>> Hibernate when a ConnectionProvider implementation, for example, >>>>>> that is >>>>>> in use gets taken away?!?). Perhaps this is just where an >>>>>> OSGi-specific >>>>>> Hibernate ServiceRegistry implementation would come into play. >>>>>> >>>>> >>>>> Adding Jesper as we were talking about how to handle "quiescence >>>>> shutdown" at the AS level, which sounds related. Once we take the >>>>> ConnectionProvider away, I would expect the Hibernate >>>>> session(s)/session factory to be broken. If/when the >>>>> ConnectionProvider comes back, Hibernate would need to re-establish >>>>> it. I'm thinking that we need a neutral (autonomic) API/SPI for >>>>> attempting to re-establish the ConnectionProvider. >>>>> >>>>> For the most part, a "quiescence shutdown" of the AS, would mean >>>>> keeping the ConnetionProvider alive until the end (of the planned >>>>> shutdown). I'm thinking that being able to re-establish the >>>>> ConnectionProvider would still be useful (for AS "quiescence >>>>> shutdown"), especially if something goes wrong during the shutdown >>>>> and >>>>> manual intervention is needed. >>>>> >>>>> To me, the process of re-establishing the ConnectionProvider, >>>>> could be >>>>> labeled "self healing" (with the help of an autonomic API/SPI). >>>>> >>>> >>>> -- >>>> st...@hibernate.org >>>> http://hibernate.org >>> >>> -- >>> st...@hibernate.org >>> http://hibernate.org >> >> -- >> st...@hibernate.org >> http://hibernate.org > > -- > st...@hibernate.org > http://hibernate.org -- st...@hibernate.org http://hibernate.org _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev