13 Replies Latest reply on Apr 5, 2018 7:51 AM by Paul Ferraro

    Wildfly 12 Cache migration error

    Florent Amaridon Newbie

      Hello,

       

      I'm trying to update wildfly 11 to 12 but I'm getting strange exception with this method CacheContainer#getCache(java.lang.String).

       

      When I call this method I get :

       

      Caused by: org.infinispan.commons.CacheConfigurationException: ISPN000436: Cache 'com/axemble/vdoc/directory/DirectoryManagerBean' has been requested, but no cache configuration exists with that name and no default cache has been set for this container
      at org.infinispan.manager.DefaultCacheManager.wireAndStartCache(DefaultCacheManager.java:611)
      at org.infinispan.manager.DefaultCacheManager.createCache(DefaultCacheManager.java:598)
      at org.infinispan.manager.DefaultCacheManager.internalGetCache(DefaultCacheManager.java:462)
      at org.infinispan.manager.DefaultCacheManager.getCache(DefaultCacheManager.java:448)
      at org.infinispan.manager.DefaultCacheManager.getCache(DefaultCacheManager.java:434)
      at org.jboss.as.clustering.infinispan.DefaultCacheContainer.getCache(DefaultCacheContainer.java:60)
      at com.axemble.commons.cache.DefaultCacheService.getCache(DefaultCacheService.java:98)
      
      

       

      I have this cache-container configuration :

       

      <subsystem xmlns="urn:jboss:domain:infinispan:5.0">
         <cache-container name="vdoc-cache" default-cache="default">
            <local-cache name="default">
            </local-cache>
         </cache-container>
      </subsystem>
      
      

       

      I found a work around by re set the default cache configuration like it :

       

      try {
           EmbeddedCacheManager embeddedCacheManager = InitialContext.doLookup("java:jboss/infinispan/container/vdoc-cache");
           org.infinispan.configuration.cache.Configuration c = new ConfigurationBuilder().clustering().cacheMode(CacheMode.LOCAL).build();
           String newCacheName = "default";
           embeddedCacheManager.defineConfiguration(newCacheName, c);
           Cache<String, String> cache = embeddedCacheManager.getCache(newCacheName); // this work
      } catch (NamingException e) {
           LOG.error(e);
      }
      

       

      It is a bad configuration, bad useage or a bug ?

       

      Cheers!

        • 1. Re: Wildfly 12 Cache migration error
          Paul Ferraro Master

          Can you paste the relevant code from com.axemble.commons.cache.DefaultCacheService.java?

          • 2. Re: Wildfly 12 Cache migration error
            aspan Newbie

            Hi,

             

            I have the same problem. I have a singleton EJB to startup the caches. This has worked well since wildfly 9 but in wildfly 12 it stopped working. The above workaround works though if I put it in the @PostConstruct below.

             

            Here is a simple EJB to reproduce the problem.

             

            @Singleton
            @Startup
            public class CacheStartup {
                @Resource(lookup = "java:jboss/infinispan/container/vdoc-cache")
                private CacheContainer cacheContainer;
            
            
                @PostConstruct
                public void initializeCaches() {
                 // This line fails
                    Cache<?, ?> cache = cacheContainer.getCache("default");
            }      
            
            
            
            • 3. Re: Wildfly 12 Cache migration error
              Florent Amaridon Newbie

              Hello here the full code :

               

              package com.axemble.commons.cache;
              
              
              import org.infinispan.Cache;
              import org.infinispan.manager.CacheContainer;
              // ...
              
              
              public class DefaultCacheService implements CacheService
              {
                public static final String VDOC_CACHE_JNDI_NAME = "java:jboss/infinispan/container/vdoc-cache";
                public static final char SEPARATOR = '/';
                private static final Logger LOG = Logger.getLogger(DefaultCacheService.class);
                
                private final CacheContainer cacheContainer;
                
                private static class SingletonHolder
                {
                  private static DefaultCacheService instance = new DefaultCacheService();
                }
                
                public DefaultCacheService()
                {
                  try
                  {
                    this.cacheContainer = InitialContext.doLookup(VDOC_CACHE_JNDI_NAME);
                    LOG.debug("Cache container found!");
                  }
                  catch (NamingException e)
                  {
                    throw new IllegalStateException("Can't get cache " + VDOC_CACHE_JNDI_NAME, e);
                  }
                }
                
                public static DefaultCacheService getInstance()
                {
                  return SingletonHolder.instance;
                }
                
                // ... 
                
                private String getRepositoryName(String... repositories)
                {
                  Validate.notEmpty(repositories);
                  if(repositories.length == 1)
                  {
                    return repositories[0];
                  }
                  
                  StringBuilder builder = new StringBuilder();
                  for (String repository : repositories)
                  {
                    builder.append(repository).append(SEPARATOR);
                  }
                  builder.setLength(builder.length()-1); // remove the last separator
                  return builder.toString();
                }
                
                private  Cache<string, t=""> getCache(String... repositories)
                {
                  return this.cacheContainer.getCache(this.getRepositoryName(repositories)); // exception is here
                }
              
              
              }
              • 4. Re: Wildfly 12 Cache migration error
                Paul Ferraro Master

                famaridon Clustering services are only ever started on demand.  Thus the reason your code fails is because your code does not establish a dependency on the requisite Infinispan resources - thus they are not available to your deployment.

                I going to guess that you must be using the "full-ha" profile, otherwise the JNDI lookup of your cache container would fail.  Cache containers (and their JNDI bindings) are started passively when the JGroups channel used by its transport starts.  Because the "full-ha" profile starts the default JGroups channel during server startup (due to a dependency from activemq broadcast/discovery), this lookup succeeds in your code.  However, if you were to run the "ha" profile, the default JGroups channel of the server is not automatically started, and thus your lookup would fail.  Additionally, your calls to getCache(...) fail because the started cache container has no cache configurations defined - as these are also only defined on demand.

                 

                To properly access an Infinispan cache in your application:

                 

                Use a <resource-ref/> or <resource-env-ref/> to make the requisite Infinispan resource available to your deployment specific JNDI namespace.

                e.g.

                <resource-ref>
                    <res-ref-name>infinispan/mycache</res-ref-name>
                    <lookup-name>java:jboss/infinispan/cache/mycontainer/mycache</lookup-name>
                </resource-ref>
                

                 

                You can now lookup the cache directly via the jndi name "java:comp/env/infinispan/mycache".

                e.g.

                @Resource("infinispan/mycache")
                private Cache<?, ?> cache;
                

                 

                Alternatively, though more verbosely, you can obtain the cache via the cache container.  However, this requires not just a dependency on the cache container, but also on the cache configuration (to ensure that it is installed in the cache container).  The primary downside to this approach is that your deployment must now handle the lifecycle of the cache.  This means you cannot (easily) reference the same cache from multiple deployments.

                e.g.

                 

                <resource-ref>
                    <res-ref-name>infinispan/mycontainer</res-ref-name>
                    <lookup-name>java:jboss/infinispan/container/mycontainer</lookup-name>
                </resource-ref>
                <resource-ref>
                    <res-ref-name>infinispan/config/mycache</res-ref-name>
                    <lookup-name>java:jboss/infinispan/configuration/mycontainer/mycache</lookup-name>
                </resource-ref>
                

                 

                @Resource("infinispan/mycontainer")
                private EmbeddedCacheManager container;
                private Cache<?, ?> cache;
                
                @PostConstruct
                public void init() {
                    this.cache = this.container.getCache("mycache");  // The <resource-ref/> to the cache configuration ensures this configuraiton is installed
                }
                
                @PreDestroy
                public void destroy {
                    this.cache.stop();
                }
                
                }
                
                1 of 1 people found this helpful
                • 5. Re: Wildfly 12 Cache migration error
                  Paul Ferraro Master

                  aspan Use the following code instead:

                  @Singleton
                  @Startup
                  public class CacheStartup {
                      @Resource(lookup = "java:jboss/infinispan/cache/vdoc-cache/default")
                      private Cache<?, ?> cache; 
                  }
                  
                  • 6. Re: Wildfly 12 Cache migration error
                    aspan Newbie

                    Thanks pferraro, got it working with <resource-ref> definitions outlined in your previous answer.

                    • 7. Re: Wildfly 12 Cache migration error
                      Florent PICOT Newbie

                      Hi and thanks you Paul,

                       

                      I work with Florent Amaridon on the same project. After adding our cache's resource-env-ref, we are now able to lookup and use the cache.

                       

                      Regards,

                      • 8. Re: Wildfly 12 Cache migration error
                        Maxim Karavaev Newbie

                        Hi Paul! pferraro

                        You mentioned a direct lookup parameter for the cache: @Resource(lookup = "java:jboss/infinispan/cache/vdoc-cache/default")

                        At the same time, I can see in the jboss-cli resource description for a cache, that such parameter in now DEPRECATED and will not be used!!!

                         "jndi-name" => {
                            "type" => STRING,
                            "description" => "The jndi-name to which to bind this cache instance.",
                            "expressions-allowed" => true,
                            "required" => false,
                            "nillable" => true,
                            "min-length" => 1L,
                            "max-length" => 2147483647L,
                            "deprecated" => {
                                     "since" => "6.0.0",
                                     "reason" => "Deprecated. Will be ignored."
                                     "access-type" => "read-write",
                                     "storage" => "configuration",
                                     "restart-required" => "resource-services"
                        },

                        BTW, my references to the cache instances are not worked in WF12 anymore and I don't know how to solve them. Should I rename them to the mentioned format or there is another trick?

                        • 9. Re: Wildfly 12 Cache migration error
                          Paul Ferraro Master

                          maxoid Correct.  The JNDI names for cache containers, caches, and cache configurations are effectively fixed, using the following patterns:

                          CacheContainer: java:jboss/infinispan/container/<container-name>

                          Cache: java:jboss/infinispan/cache/<container-name>/<cache-name>

                          Cache configuration: java:jboss/infinispan/configuration/<container-name>/<cache-name>

                           

                          Additionally, the default cache of a container and its configuration use the following JNDI name patterns:

                          Default Cache: java:jboss/infinispan/cache/<container-name>/default

                          Default cache configuration: java:jboss/infinispan/configuration/<container-name>/default

                           

                          Anyone needing/wanting to reference these resources using custom names in their code can do so via a resource-ref or resource-env-ref.

                          • 10. Re: Wildfly 12 Cache migration error
                            Gábor Boros Newbie

                            Hello!

                            I have the same problem. I tried to define the resource-ref tag but it didn't worked. How do I define it in an EJB project?


                            • 11. Re: Wildfly 12 Cache migration error
                              Paul Ferraro Master

                              gaboros The standard schema for the ejb-jar.xml deployment descriptor contains a resource-ref element.

                              See: http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/ejb-jar_3_2.xsd

                              • 12. Re: Wildfly 12 Cache migration error
                                Gábor Boros Newbie

                                <enterprise-beans>
                                  <session>
                                  <ejb-name>MyName</ejb-name>
                                  <ejb-class>MyClass</ejb-class>
                                  <session-type>Stateless</session-type>
                                  <resource-ref>
                                  <res-ref-name>infinispan/my-cache-container</res-ref-name>
                                  <res-type>org.infinispan.manager.CacheContainer</res-type>
                                  <mapped-name>java:jboss/infinispan/container/my-cache-container</mapped-name>
                                  </resource-ref>
                                  <resource-ref>
                                  <res-ref-name>infinispan/my-cache-config</res-ref-name>
                                  <res-type>org.infinispan.configuration.cache.Configuration</res-type>
                                  <mapped-name>java:jboss/infinispan/configuration/my-cache-container/default</mapped-name>
                                  </resource-ref>
                                  </session>
                                </enterprise-beans>

                                 

                                It worked this way, but it doesn't work with Wildfly-10 now because it's doesn't found the cache config.

                                • 13. Re: Wildfly 12 Cache migration error
                                  Paul Ferraro Master

                                  gaboros You need to use <lookup-name/> instead of <mapped-name/>.