ppatierno
ppatierno

Reputation: 10065

Get the CamelContext for standalone Apache Camel instance

I'm using the Main class from Apache Camel to run it as standalone. I need to use the JMS component so I have to add it to the CamelContext instance used by the Main class. Of course I need to do that before calling main.run(args) method.

The problem is the following ... Using main.getCamelContexts().get(0) returns an index out of bounds exception. Using main.getOrCreateCamelContext() returns a valid CamelContext instance named "camel-1" to which I'm able to add my JMS component but .... when I execute main.run(args), another CamelContext named "camel-2" is used !

The only way I found to add my JMS component is to use :

main.bind("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));

Is this the only way or the CamelContext way should work ?

Thanks, Paolo.

Upvotes: 1

Views: 4285

Answers (2)

Robin
Robin

Reputation: 151

Old Question, but was able to figure it out - tried with camel 2.17.x version

private void runMyExample() {
    //Add a Main Listener
    main.addMainListener(new MyMainListener);
    main.run();
}

public static class MyMainListener extends MainListenerSupport {
    @Override
    public void afterStart(MainSupport main) {
        System.out.println("MainExample with Camel is now started!");

        //This is the right instance
        CamelContext context = main.getCamelContexts().get(0); 
    }

    @Override
    public void beforeStop(MainSupport main) {
        System.out.println("MainExample with Camel is now being stopped!");
    }
}

Regards, R.

Upvotes: 1

Vyacheslav Enis
Vyacheslav Enis

Reputation: 1661

You can provide completely own camel context to be used. To achieve that you can inherit org.apache.camel.main.Main and override only one method

protected Map<String, CamelContext> getCamelContextMap()

Here is the example of inherited body:

@Override
protected Map<String, CamelContext> getCamelContextMap() {
    Map<String, CamelContext> camelContextMap = new HashMap<>();
    DefaultCamelContext camelContext = new DefaultCamelContext();
    camelContext.setName("MyContext");

    // Add your context configuration here

    camelContextMap.put("connectorContext", camelContext);
    return camelContextMap;
}

In general it is better to create context map not in the "getCamelContextMap()" inherited method but somewhere in the constructor.

Upvotes: 1

Related Questions