Ahto Luuri
Ahto Luuri

Reputation: 238

Configuring Jetty component in Camel 2.15

I'm trying to start using Jetty with Camel. I have added the dependency to my pom:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-jetty</artifactId>
        <version>2.15.5</version>
    </dependency>

My CamelContext is initialized as follows:

public void startCamelContext() throws Exception {
    CamelContext camelContext = new DefaultCamelContext(); 
    camelContext.addComponent("jetty", new JettyHttpComponent8());
    camelContext.start();
}

When I try to start up my service, which has a route with endpoint defined as:

jetty:http://0.0.0.0:9000/httpInput

I get an exception:

java.lang.NullPointerException: null
at org.apache.camel.component.jetty8.JettyHttpComponent8.createConnectorJettyInternal(JettyHttpComponent8.java:48)
at org.apache.camel.component.jetty.JettyHttpComponent.createConnector(JettyHttpComponent.java:585)
at org.apache.camel.component.jetty.JettyHttpComponent.getSocketConnector(JettyHttpComponent.java:527)
at org.apache.camel.component.jetty.JettyHttpComponent.getConnector(JettyHttpComponent.java:517)
at org.apache.camel.component.jetty.JettyHttpComponent.connect(JettyHttpComponent.java:320)
at org.apache.camel.component.http.HttpEndpoint.connect(HttpEndpoint.java:185)
at org.apache.camel.component.http.HttpConsumer.doStart(HttpConsumer.java:53)
at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
at org.apache.camel.impl.DefaultCamelContext.startService(DefaultCamelContext.java:2885)
at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRouteConsumers(DefaultCamelContext.java:3179)
at org.apache.camel.impl.DefaultCamelContext.doStartRouteConsumers(DefaultCamelContext.java:3115)
at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3045)
at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:2813)
at org.apache.camel.impl.DefaultCamelContext.startAllRoutes(DefaultCamelContext.java:865)

The documentation on how to set up the Jetty component is lacking at best. I found a mailing-list entry where it was said that JettyHttpComponent has been made abstract since Camel 2.15 and now that component has to be configured using JettyHttpComponent8 or 9. link

In my case, I'm using Camel 2.15.5 and the JettyHttpComponent9 isn't available in the classpath, and using 8 gives the exception described above. I also found related discussion here with no information on how to actually use that component.

Upvotes: 1

Views: 1622

Answers (2)

mkbrv
mkbrv

Reputation: 407

To start a camel context outside spring you need to create a continuous thread to keep camel alive, as explaine here: http://camel.apache.org/running-camel-standalone-and-have-it-keep-running.html

Don't worry, I have below some code that will setup a jetty on localhost:8081 for you:

pom.xml

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-jetty</artifactId>
        <version>2.16.1</version>
    </dependency>

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-core</artifactId>
        <version>2.16.1</version>
    </dependency>


import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.main.Main;
import org.apache.camel.main.MainListenerSupport;
import org.apache.camel.main.MainSupport;

import java.util.Date;

/**
 * Created by mkbrv on 22/06/16.
 */
public class CamelJetty {

        private Main main;

        public static void main(String[] args) throws Exception {
            CamelJetty example = new CamelJetty();
            example.boot();
        }

        public void boot() throws Exception {
            // create a Main instance
            main = new Main();
            // bind MyBean into the registry
            main.bind("foo", new MyBean());
            // add routes
            main.addRouteBuilder(new MyJettyRouteBuilder());
            // add event listener
            main.addMainListener(new Events());

            // run until you terminate the JVM
            System.out.println("Starting Camel. Use ctrl + c to terminate the JVM.\n");
            main.run();
        }

        private static class MyJettyRouteBuilder extends RouteBuilder {
            @Override
            public void configure() throws Exception {
                from("jetty:http://localhost:8081")
                        .process(exchange -> {
                            System.out.println("Invoked timer at " + new Date());
                            exchange.getOut().setBody("Hi, this is Camel!");
                        })
                        .bean("foo");
            }
        }

        public static class MyBean {
            public void callMe() {
                System.out.println("MyBean.callMe method has been called");
            }
        }

        public static class Events extends MainListenerSupport {

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

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

Next just go to http://localhost:8081 and you should see a welcome message. Have fun tweaking this further more.

Upvotes: 0

Ninja Code Monkey
Ninja Code Monkey

Reputation: 216

That's typically not how the CamelContext is initialized/started. Please consider using an archetype to get started, then add the Jetty Maven dependency and see if the error can be reproduced.

Camel archetypes can be found here: http://camel.apache.org/camel-maven-archetypes.html

Upvotes: 0

Related Questions