Although it appears this topic has been discussed in other threads, I don't see 
guidance on the fix.

My tomee.xml contains the following boilerplate:
<tomee>
  <!-- see http://tomee.apache.org/containers-and-resources.html -->

  <Resource id="MyJmsResourceAdapter" type="ActiveMQResourceAdapter">
    BrokerXmlConfig =  broker:(tcp://localhost:61616)
    ServerUrl       =  tcp://localhost:61616
  </Resource>

  <Resource id="MyJmsConnectionFactory" type="javax.jms.ConnectionFactory">
    ResourceAdapter = MyJmsResourceAdapter
  </Resource>

  <Container id="MyJmsMdbContainer" ctype="MESSAGE">
    ResourceAdapter = MyJmsResourceAdapter
  </Container>

</tomee>


My webapp is initialized with container resources as follows. This results in a 
ConnectionFactory with the standard class loader, not the webapp loader, 
although the thread running the init() call has the webapp 
LazyStopWebappClassLoader.

public class InitServlet extends HttpServlet {

   @Resource
   private ConnectionFactory connectionFactory;

   public void init(ServletConfig config) throws ServletException
   {

         // ------- JMS service start --------------
         try {
            connection = connectionFactory.createConnection();
            connection.start();

            // set up cfgMgmt services
            Session session = connection.createSession(false, 
Session.AUTO_ACKNOWLEDGE);
            MySvc mySvc = new MySvc (session);
}

public class MySvc implements MessageListener
{
   private Session session;
   private MessageConsumer consumer;
   private MessageProducer writer;

   public MySvc(Session session)
   {
      this.session = session;
         writer = session.createProducer(null); 
         Destination destination_in =
                  session.createQueue("myqueue");
         consumer = session.createConsumer(destination_in);
         consumer.setMessageListener(this);
   }

 ...

Because MySvc was created by the LazyStopWebappClassLoader thread, it's objects 
are loaded by it. 
However when I receive a message:

   public void onMessage(Message request)
   {
            Object reqObj = ((ObjectMessage) request).getObject();
            if (!(reqObj instanceof BaseMsg)) {
               throw new Exception("FUNCTIONALITY_NOT_SUPPORTED");
            }

...
   }
the deserialization was done by the connectionFactory's classLoader (not the 
webapp loader), so the class instanceof compare fails.

Is there a common sense way to resolve this in the TomEE environment 
configuration?


--------------------------------------------------------------------------
   "The most precious thing we have is life, yet it has absolutely no
    trade-in value."

Robert R. Allen                     Sr Principal Software Architect
[email protected]  (919)677-2899  CA Technologies
------------------------------

Reply via email to