Recently I was involved in the setup of a new content-delivery environment, migrating from a WebSphere 7.* application server to WebSphere 8.5.5. Right away when we started up the application, we started seeing some content-delivery errors with our session preview web-service which we did not experience on WebSphere 7. I’m going to review the problem, and talk about how it was resolved.
The error that kept coming up was the classic ‘NoClassDefFoundError’ for the StorageManagerFactory – but it was complaining about a concurrency issue. I hadn’t seen this particular error before in my dealings with session-preview or other CD modules.
com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[Content Delivery Web service]: java.lang.NoClassDefFoundError: com.tridion.storage.StorageManagerFactory (initialization failure)
Caused by: java.lang.RuntimeException: Fatal error, unable to load the StorageManagerFactory
Caused by: java.util.ConcurrentModificationException
We had downloaded the latest set of CD JARs for the new setup, so to rule out any compatibility issues we pulled the entire set of JARs from the existing WebSphere 7.* environment and deployed them on our new 8.5.* server – but still, the errors remained. The deployer had previously been sitting on the same application server (WebSphere 8.5.5) with no errors – so we were stumped as to what the problem could be.
In the end, after a lot of experimentation with the application server, the issue ended up caused by two things:
- We were loading the core server JARs before the application JARs (WebSphere, etc).
- We had both the main site application and CD preview web-service hosted on the same WebSphere server, loading at the same time.
The solution(s) to both were simple once the problem was identified. First, we need to be sure that we make sure that we’re loading the application JARs before the core server JARs. This is done by navigating to the application and opening the “Manage Modules” section; the drop-down should be defaulted to “Classes loaded with parent class loader first” as seen below.
Change the drop-down to “Classes loaded with local class loader first (parent last)” to ensure that the application JARs are being loaded first.
Finally – we need to adjust the load order of the applications (if you have your application running on the same server as you’re trying to run your web-service, deployer – etc). Navigate to the “Startup Behavior” > “General Properties” > “Startup Order”. Here you can configure the start-up order for your applications, ensuring that they are not loading in parallel.
In the end, those two configurations changes ended up working for us using the latest set of JARs. It’s worth noting these configurations had not been made in the previous environment, but the updates to WebSphere in the move from 7.* to 8.5.* necessitated the changes. Once the configurations were made and the server was restarted, our concurrency issues went away and we were able to properly pull content with the session preview web-service once again.