ProfileService shutdown and undeploy order
adrian.brock Jan 25, 2008 12:22 PMThe problem with the NoInitialContext in the all configuration
is because it is not undeploying the in the reverse order of deployment.
17:49:05,946 ERROR [DefaultPartition] partition unbind operation failed javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:247) at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:284) at javax.naming.InitialContext.unbind(InitialContext.java:375) at org.jboss.ha.framework.server.ClusterPartition.stopService(ClusterPartition.java:408)
The issue is that the ProfileServiceBootstrap just does a MainDeployer.shutdown()
but this just undeploys in "random" order.
private Map<String, DeploymentContext> topLevelDeployments = new ConcurrentHashMap<String, DeploymentContext>(); public void shutdown() { lockWrite(); try { while (topLevelDeployments.isEmpty() == false) { // Remove all the contexts for (DeploymentContext context : topLevelDeployments.values()) { topLevelDeployments.remove(context.getName()); removeContext(context, true); } // Do it process(); }
In the example above, conf/jboss-service.xml is undeployed before
the clustering deployment.
This can obviously be fixed, but I guess what should really be happening
is the ProfileService undeploys in reverse order of stages,
i.e. APPLICATION then DEPLOYER then BOOTSTRAP.
The MainDeployer.shutdown() should just be there to catch things
that don't undeploy themselves properly.
The problem is that the Profile api doesn't guarantee any ordering
Collection<VFSDeployment> getDeployments(DeploymentPhase phase) throws Exception;
even though it is implemented as ordered in ProfileImpl using LinkedHashMaps
private LinkedHashMap<String, VFSDeployment> bootstraps = new LinkedHashMap<String, VFSDeployment>(); private LinkedHashMap<String, VFSDeployment> applications = new LinkedHashMap<String, VFSDeployment>(); private LinkedHashMap<String, VFSDeployment> deployers = new LinkedHashMap<String, VFSDeployment>();