== Camel Spring Boot Example: HTTP Large File Streaming


=== Introduction

This project contains logic to handle large HTTP data streams in download, upload, and proxy scenarios. The aim is to show Camel's ability to process streams without exhausting JVM memory.

=== Use cases

[NOTE]
====
Streaming mode opens up many interesting use cases, for example, data transformation on very large data structures, applying selective/discarding rules, split/merging of data, multiplexing data streams, and others.
====

This example only covers the basics of enabling streaming mode. The two implemented scenarios using Camel in streaming mode are:

- HTTP data downloads
- HTTP data uploads

Camel may act as the end system responsible to locally/remotely store the data stream. Or it may also act as a proxy system, passing the responsibility downstream.

The critical data handling happens in the numbered 1) and 2) positions illustrated below.

=== Download scenario

image::docs/images/uc-download.png[]

=== Upload scenario

image::docs/images/uc-upload.png[]


=== How to run

To demonstrate Camel can handle larger data streams than memory allocated to the JVM, we need to start it with low memory settings.

Follow these steps to run the example:

1. Decide which scenario you want to run: `download` or `upload`.

2. Navigate to the corresponding folder and run both the backend and proxy servers with low memory settings (make sure ports 8080 and 9000 are available):

    mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xms200m -Xmx200m"

3. From the `client` directory, send a request using a large data stream.
(See detailed instructions in link:download/client/Readme.adoc[`download/client/Readme.adoc`] or link:upload/client/Readme.adoc[`upload/client/Readme.adoc`].)

4. Stop Camel Spring Boot and inspect the result file.

  Camel Spring Boot should process the HTTP byte stream and dump it in a file in the 'client' directory.

=== OpenShift

1. Start by creating a new OpenShift project:

    oc new-project {ocp-project}

2. Decide which scenario you want to run: `download` or `upload`.

3. Review the `application.properties` files in both the backend and proxy server modules, and follow the configuration instructions there.

4. Build and deploy both modules using the following command:

    mvn clean package -Popenshift

5. Navigate to link:download/client/Readme.adoc[`download/client/Readme.adoc`] or link:upload/client/Readme.adoc[`upload/client/Readme.adoc`] and follow the instructions provided there.

6. Run the following command to clean the project before running the next example:

    oc delete all -n {ocp-project} --all


=== Help and contributions

If you hit any problem using Camel or have some feedback, then please
https://camel.apache.org/community/support/[let us know].

We also love contributors, so
https://camel.apache.org/community/contributing/[get involved] :-)

The Camel riders!
