= HTTP with vanilla JAX-RS or with Camel `platform-http` component: A Camel Quarkus example
:cq-example-description: An example that shows how to create HTTP endpoints using either the RESTEasy
implementation of JAX-RS or using Camel `platform-http` component.

{cq-description}

The Quarkus REST service `ExampleResource.java` and the Camel route `CamelRoute.java`
are independent and are present in this example to demonstrate how you can build microservices
with both Quarkus and Camel separated.

You can of course also combine Quarkus REST services with Camel (see further below).

TIP: Check the https://camel.apache.org/camel-quarkus/latest/first-steps.html[Camel Quarkus User guide] for prerequisites
and other general information.

This example was used in a 10 minute video recording to demonstrate
how to quickly run 100 Camels with Apache Camel, Quarkus and GraalVM:

- https://www.youtube.com/watch?v=4lXSf8DBQkQ


== Start in the Development mode

[source,shell]
----
$ mvn clean compile quarkus:dev
----

The above command compiles the project, starts the application and lets the Quarkus tooling watch for changes in your
workspace. Any modifications in your project will automatically take effect in the running application.

TIP: Please refer to the Development mode section of
https://camel.apache.org/camel-quarkus/latest/first-steps.html#_development_mode[Camel Quarkus User guide] for more details.

From a web browser, you can call the two services via

- http://localhost:8080/hello
- http://localhost:8080/camel/hello

There is also health check and metrics available from the following urls:

- http://localhost:8080/health
- http://localhost:8080/metrics

=== Package and run the application

Once you are done with developing you may want to package and run the application.

TIP: Find more details about the JVM mode and Native mode in the Package and run section of
https://camel.apache.org/camel-quarkus/latest/first-steps.html#_package_and_run_the_application[Camel Quarkus User guide]

==== JVM mode

[source,shell]
----
$ mvn clean package
$ java -jar target/*-runner.jar
...
[io.quarkus] (main) camel-quarkus-examples-... started in 1.163s. Listening on: http://0.0.0.0:8080
----

==== Native mode

IMPORTANT: Native mode requires having GraalVM and other tools installed. Please check the Prerequisites section
of https://camel.apache.org/camel-quarkus/latest/first-steps.html#_prerequisites[Camel Quarkus User guide].

To prepare a native executable using GraalVM, run the following command:

[source,shell]
----
$ mvn clean package -Pnative
$ ./target/*-runner
...
[io.quarkus] (main) camel-quarkus-examples-... started in 0.013s. Listening on: http://0.0.0.0:8080
...
----

== Using Camel from Quarkus JAX-RS

The `ExampleResource.java` is a pure JAX-RS REST service without using Camel.
Suppose you wanted to add a HTTP POST that sends the HTTP body to a Kafka topic,
via the camel-kafka component. You can then integrate Quarkus
with Camel by dependency injecting Camels `FluentProducerTemplate` that allows to
send the message in one line of code to Kafka. What's left is to configure the URL to the Kafka brokers,
which can be done in the `application.properties` file.

[source,java]
----
import org.apache.camel.FluentProducerTemplate;
import org.jboss.resteasy.annotations.Body;
import javax.inject.Inject;
import javax.ws.rs.Consumes;

@Path("/hello")
public class ExampleResource {

    @Inject
    FluentProducerTemplate producer;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }

    @POST
    @Consumes(MediaType.TEXT_PLAIN)
    public void foo(@Body String payload) {
        producer.to("kafka:foo").send(payload);
    }
}
----

== Feedback

Please report bugs and propose improvements via https://github.com/apache/camel-quarkus/issues[GitHub issues of Camel Quarkus] project.
