org.apache.camel.impl.DefaultComponent.doStop() - callback at shutdown
pchandler Sep 23, 2010 3:29 PM
"If you component extend DefaultComponent then it should already implement the Service. The idea is then you can override the doStart / doStop methods."
I try to override the doStop in my camel component as shown:
public class MyCamelComponent extends DefaultComponent { // Other methods createEndpoint, ... /** * When the camel context.stop() is called this method should be invoked. * * @see http://camel.apache.org/lifecycle.html * */ @Override protected void doStop() throws Exception { System.out.println("doStop()"); LOG.info( "doStop()"); // clean-up/release ALL external resources. BasicDataSource ds = dataSource(); if (ds != null) { try { ds.close(); LOG.info("Closing database connections for DB " + ds.getUrl() ); } catch (Exception e) { LOG.error("Error shutting down database " + ds.getUrl(), e); throw e; } } // call the super's stop. try { super.doStop(); } catch (Exception e) { LOG.error("Error in super.doStop();",e); } } }
Created a route that calls my component
<!-- MyCamelComponent --> <bean id="myComponent" class="com.mycompany.MyCamelComponent"> <property name="dataSource" ref="dataSource"></property> </bean> <camelContext id="test" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="jms:topic:incoming"></from> <to uri="myComponent://."></to> </route> </camelContext>
In my junit (note: SpringCamelContext context) I added code:
/** Stop the camel context. */ public void tearDown() { try { LOG.info( "JUnit teardown and stop the camel context " + context.getName()); context.stop(); } catch ( Exception e ) { LOG.error("Error Stopping Conext", e ); } }
Results
The route starts
Route runs successfully
In the log: JUnit teardown and stop the camel context camel-2
doStop() does not get called?
Question:
Help: Why doesn't doStop() get called? What am I forgetting?
Again thanks in advance,
Peter.