[infinispan-issues] [JBoss JIRA] (ISPN-3847) Improve resilience of ModuleLifecycle loading

Paul Ferraro (JIRA) issues at jboss.org
Wed Dec 18 10:09:33 EST 2013


Paul Ferraro created ISPN-3847:
----------------------------------

             Summary: Improve resilience of ModuleLifecycle loading
                 Key: ISPN-3847
                 URL: https://issues.jboss.org/browse/ISPN-3847
             Project: Infinispan
          Issue Type: Enhancement
          Components: Core API
    Affects Versions: 6.0.0.Final
            Reporter: Paul Ferraro
            Assignee: Mircea Markus


Currently, org.infinispan.util.ModuleProperties.resolveModuleLifecycles(...) uses a ServiceLoader to directly load ModuleLifecycle instances.  However, if a jar exists on the classpath containing a META-INF/services/org.infinispan.lifecycle.ModuleLifecycle file, but the class name contained within cannot be loaded, due to, for example, a dependency jar being missing, then the whole resolveModuleLifecycles(...) method chokes due to a ServiceConfigurationError.  For example, if infinispan-query is on the classpath, but hibernate-search is not, Infinispan is unusable.

I can see 2 ways to fix this:

1. Use the iterator directly instead of the enhanced for-loop, and catch and handle the SCE:
e.g.
{code:java}
Iterator<ModuleLifecycle> lifecycles = ServiceLoader.load(ModuleLifecycle.class, classLoader);
while (lifecycles.hasNext()) {
   try {
      ModuleLifecycle lifecycle = lifecycles.next(); // This can throw SCE
      result.add(lifecycle);
   } catch (ServiceConfigurationError e) {
      // Log error
   }
}
{code}

2. Introduce a ModuleLifecycleProvider abstraction - that won't throw an SCE.  The ServiceLoader spec actually recommends this:
"The provider class is typically not the entire provider itself but rather a proxy which contains enough information to decide whether the provider is able to satisfy a particular request together with code that can create the actual provider on demand."
In the end, this would look something like:
{code:java}
for (ModuleLifecycleFactory factory: ServiceLoader.load(ModuleLifecycleFactory.class, classLoader)) {
   if (factory.isEnabled()) { // returns true if create method will not throw SCE
      ModuleLifecycle lifecycle = factory.createModuleLifecycle();
      result.add(lifecycle);
   }
}
{code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the infinispan-issues mailing list