[ 
https://issues.apache.org/jira/browse/ARTEMIS-90?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Justin Bertram closed ARTEMIS-90.
---------------------------------
    Resolution: Fixed

> ClassNotFoundException when a backup server fails over after having failed 
> back
> -------------------------------------------------------------------------------
>
>                 Key: ARTEMIS-90
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-90
>             Project: ActiveMQ Artemis
>          Issue Type: Bug
>    Affects Versions: 1.0.0
>            Reporter: Jeff Mesnil
>            Assignee: Justin Bertram
>             Fix For: 1.0.1
>
>
> I'm integrating ActiveMQ 6 in WildFly and testing out its failover features.
> My use case is:
> 2 servers:
>   * server #1 with replicated master HA (check-for-live-serve=true)
>   * server #2 with replicated slave HA (restart-backup=true)
> * both servers are started
>   => #1 is master
>   => #2 announces it is a backup
> * server #1 is stopped
>   => #2 fails over and becomes live
> * server #1 is restarted
>   => #2 detects the live is up again and fails back
> * server #1 is stopped again
>   => I was expecting server #2 to becomes live again but instead, I got the 
> following exception:
> {noformat}
> 16:27:07,528 WARN  [org.apache.activemq.core.server] (AMQ119000: Activation 
> for server ActiveMQServerImpl::serverUUID=null) AMQ222080: Error 
> instantiating remoting acceptor 
> org.apache.activemq.core.remoting.impl.netty.NettyAcceptorFactory: 
> java.lang.ClassNotFoundException: 
> org.apache.activemq.core.remoting.impl.netty.NettyAcceptorFactory from 
> [Module "org.wildfly.extension.io:main" from local module loader @6e32bb55 
> (finder: local module finder @44a901f8 (roots: 
> /Users/jmesnil/Developer/wildfly/dist/target/slave/modules,/Users/jmesnil/Developer/wildfly/dist/target/slave/modules/system/layers/base))]
>         at 
> org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:216)
>         at 
> org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:455)
>         at 
> org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:404)
>         at 
> org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:385)
>         at 
> org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:130)
>         at 
> org.apache.activemq.core.remoting.server.impl.RemotingServiceImpl.start(RemotingServiceImpl.java:235)
>         at 
> org.apache.activemq.core.server.impl.ActiveMQServerImpl.initialisePart2(ActiveMQServerImpl.java:1778)
>         at 
> org.apache.activemq.core.server.impl.SharedNothingBackupActivation.run(SharedNothingBackupActivation.java:280)
>         at java.lang.Thread.run(Thread.java:744)
> {noformat}
> The CFNE occurs because WildFly uses a modular class loader.
> The SharedNothingBackupActivation runnable is run by creating a new 
> backupActivationThread (ActiveMQServerImpl.java:425).
> In a modular environment this thread's module has not knowledge of the 
> NettyAcceptorFactory class.
> To prevent this CFNE, this thread should use the TCCL before loading the 
> acceptor factory from its class names.
> Additionally, I'm not sure it's a good idea to create new Thread like this. 
> ActiveMQ has a threadPool executorService that could be used to run such 
> code. Since ActiveMQ supports injection of this threadPool (through the 
> serviceRegistry), WildFly could ensure that any code run by this thread pool 
> will be using the correct module class loader.
> Is there a good reason to use a separate thread for the backup activation?
>   



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to