Andy Miller ported an example Order application that was used for performance testing from EAP 5.1 to AS 7. These are the notes he made during the migration process.
The application is relatively simple. it contains three servlets, some stateless session beans, a stateful session bean, and some entities.
In addition to application code changes, modifications were made to the way the EAR was packaged. This is because AS7 removed support of some proprietary features that were available in EAP 5.1.
Since this application was first written for EAP 4.2/4.3, which did not support EJB reference injection, the servlets were using pre-EE 5 methods for looking up stateless and stateful session bean interfaces. While migrating to AS7, it seemed a good time to change the code to use the @EJB annotation, although this was not a required change.
The real difference is in the lookup name. AS 7 only supports the new EE 6 portable JNDI names rather than the old EAR structure based names. The JNDI lookup code changed as follows:
Example of code in the EAP 5.1 version:
Example of how this is now coded in AS7:
In addition to the change to injection, which was supported in EAP 5.1.0, the lookup name changed from:
All the other beans were changed in a similar manner. They are now based on the portable JNDI names described in EE 6.
The next major change was to logging within the application. The old version was using the commons logging infrastructure and Log4J that is bundled in the application server. Rather than bundling third-party logging, the application was modified to use the new JBoss Logging infrastructure.
The code changes themselves are rather trivial, as this example illustrates:
Old JBoss Commons Logging/Log4J:
New JBoss Logging
Old JBoss Commons Logging/Log4J:
New JBoss Logging:
In addition to the code changes made to use the new A7 JBoss log manager module, you must add this dependency to the MANIFEST.MF file as follows:
Jboss Cache has been replaced by Infinispan for 2nd level cache. This requires modification of the persistence.xml file.
This is what the file looked like in EAP 5.1:
This is how it was modified to use Infinispan for the same configuration:
Most of the properties are the same, however, there are two notable differences:
- There is a new Infinispan factory value for the "hibernate.cache.region.factory_class" property.
- A new property "hibernate.cache.infinispan.cachemanager" is defined to specify the JNDI name of the cache manager.
Other than that, everything else is the same.
That was the extent of the code changes required to migrate the application to AS7.
Due to modular class loading changes, the structure of the existing EAR failed to deploy successfully in AS7.
The old structure of the EAR was as follows:
In this structure, the entities and the persistence.xml were in one jar file, OrderManagerEntities.jar, and the stateless and stateful session beans were in another jar file, OrderManagerEJB.jar. This did not work due to modular class loading changes in AS 7. There are a couple of ways to resolve this issue:
- Modify the class path in the MANIFEST.MF
- Flatten the code and put all the beans in one JAR file.
The second approach was selected because it simplified the EAR structure:
Since there is no longer an OrderManagerEntities.jar file, the applcation.xml file was modified to remove the entry.
An entry was added to the MANIFEST.MF file in the OrderManagerWeb.war to resolve another class loading issue resulting from the modification to use EJB reference injection in the servlets.
The Class-Path entry tells the application to look in the OrderManagerEJB.jar file for the injected beans.
Although the existing EAR structure could have worked with additional modifications to the MANIFEST.MF file, this approach seemed more appealing because it simplified the structure while maintaining the web tier in its own WAR.
The source files for both versions is attached so you can view the changes that were made to the application.