Camel Main

O Camel pode ser executado em diferentes runtimes, como servidores de aplicação como o Wildlfy, Oracle Weblogic, IBM WebSphere e outros.

Entretanto, com a popularização dos micro-serviços e a containerização de soluções, onde, por exemplo, os projetos são executados em contêineres rodando dentro de clusters Kubernetes, é cada vez mais comum a criação de aplicações leves.

Muitas vezes essas aplicações necessitam apenas uma camada fina de abstração capaz de inicializar a aplicação, ler um arquivo configuração ou variáveis de ambiente e executar as rotas. O Camel fornece uma classe Main que facilita o trabalho de rodar o Camel sem a necessidade de um runtime adicional. Essa classe permite o que se chama de inicialização em modo standalone.

O código abaixo mostra um exemplo de como utilizar essa classe:

package primeiro.app.camel;

import org.apache.camel.main.Main;

/**
 * A Camel Application
 */
public class MainApp {
    public static void main(String... args) throws Exception {
        Main main = new Main();
        main.configure().addRoutesBuilder(new MyRouteBuilder());
        main.run(args);
    }

}

Para utilizar essa classe é necessário incluir a dependência camel-main no projeto.

Eventualmente pode ser necessário durante alguma parte do ciclo de vida da classe Main. Para isso o Camel oferece uma interface chamada MainListener que provê métodos que são executados em diferentes pontos do ciclo de vida da classe Main.

public class ExampleMainListener implements MainListener {
    @Override
    public void afterConfigure(BaseMainSupport main) {

    }

    @Override
    public void afterStart(BaseMainSupport main) {
        // Roda depois que o contexto foi criado
    }

    @Override
    public void afterStop(BaseMainSupport main) {
        // Roda depois que o contexto foi parado
    }

    @Override
    public void beforeConfigure(BaseMainSupport main) {
        // Roda depois de o contexto ter sido criado e antes da auto-configuração
    }

    @Override
    public void beforeInitialize(BaseMainSupport main) {
        // Roda depois de o contexto ter sido inicializado e antes da auto-configuração
    }

    @Override
    public void beforeStart(BaseMainSupport main) {
        // Roda antes de o contexto ter sido criado e inicializado
    }


    @Override
    public void beforeStop(BaseMainSupport main) {
        // Roda depois de o contexto ter sido parado
    }

    @Override
    public void configure(CamelContext context) {
        // Roda após a configuração (note que esse método não deve mais ser utilizado, pois está depreciado)
    }
}

Posteriormente, uma instância dessa classe pode ser adicionada a uma instância da classe Main da seguinte forma:

Main main = new Main();

main.addMainListener(new ExampleMainListener());
main.run(args);