Brak opisu

Grega Bremec 15f229e575 add property examples for bookstore input files, refer to README.md in BookstoreRoutes, and describe bookstore problem in README.md 6 miesięcy temu
data d91d04a87a sort of in a good state, initial import after refactoring 6 miesięcy temu
scripts d91d04a87a sort of in a good state, initial import after refactoring 6 miesięcy temu
src 15f229e575 add property examples for bookstore input files, refer to README.md in BookstoreRoutes, and describe bookstore problem in README.md 6 miesięcy temu
.gitignore d91d04a87a sort of in a good state, initial import after refactoring 6 miesięcy temu
README.md 15f229e575 add property examples for bookstore input files, refer to README.md in BookstoreRoutes, and describe bookstore problem in README.md 6 miesięcy temu
pom.xml d91d04a87a sort of in a good state, initial import after refactoring 6 miesięcy temu

README.md

Camel Spring Boot Demo Routes

This is a collection of demonstrational routes to accompany Apache Camel training.

In order to choose which problem you want to explore and test, start the Spring Boot application with the system property camel.problem set to one of the available values:

  • intro
  • database
  • jms
  • kafka
  • rest-service
  • rest-client
  • http-client
  • health
  • bookstore

See more on individual problems (and the requirements to run them) below.

The main class, Application, is your classic Spring Boot application starter.

The class that performs the problem configuration by loading specific routes is CamelContextConfig.

For a Maven plug-in-assisted start-up, you can select the problem as follows:

$ mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dcamel.problem=FOO"

After packaging the application, you can run a problem as follows:

$ mvn spring-boot:repackage
...
$ java -Dcamel.problem=FOO -jar ./target/demo-1.0-SNAPSHOT.jar

Bookstore

Bookstore has three routes loading data from data/bookstore/ directory:

  • books.xml (overridable by books.file property)
  • users.csv (can be overriden by app property users.file)
  • orders.json (property orders.file can override this)

The three file consumer routes are configured with noop option, so the files are never removed.

Book Catalog (bookLoader)

The books.xml file represents a bookstore catalog, which is loaded, split into individual books, then unmarshaled from XML into instances of Book object. Two filters then remove any books older than 2004 and any books written by "George R. R. Martin" (supposing we can not sell those due to contractual obligations). The last processor in the route adds each book to an internal singleton bean where it can be further accessed by other routes in need of enrichment.

User Catalog (userLoader)

The users.csv file is a user catalog, loaded, split into individual records by newline, and the first row containing column headers is ignored. The remaining records are unmarshaled from CSV into instances of User object. There is a spin-off step where we invoke the userAggregator route, which is discussed below.

Lastly, we try to add the user to the singleton bean which, like with books, represents the user catalog and is available to other routes for enrichment. Note that the bean invocation is not specifying the exact method, unlike with the book catalog - this is just to demonstrate Camel's automatic method detection.

The seeming complication in unmarshaling is there because one of the rows in the CSV file is deliberately corrupt and will not parse. Without splitting first and then unmarshaling, the entire file would be read multiple times and valid records would cause duplicates in the user catalog, not to mention needless overhead.

Team Aggregation (userAggregator)

The route consuming from direct:aggregateByTeam is showcasing aggregation on a field of the body object, and a simple aggregation strategy which has a limit of 10 users per team and will complete if no new users have been seen for over 1.5s in each aggregation group.

After finishing the aggregation it marshals the team into JSON and writes it into data/out/teams.json file for later inspection.

Order Processor (orderLoader)

The order processor loads from orders.json file, unmarshals the contents into a List of Order objects, and then converts each order into an instance of a fully-blown FulfillmentOrder class which is suitable for fulfillment.

Because the object is initially empty (with the exception of user ID and book title), we need to enrich the data and this is performed using the enrich() EIP. The orderEnrichment route is discussed below.

After FulfillmentOrder objects are enriched, they are marshaled back into JSON and written to data/out/orders.json.

Order Enrichment (orderEnrichment)

The route invokes two different methods in FulfillmentEnrichment class - enrichUser and enrichBook, each of which contacts its catalog in order to obtain data about the user (identified by the user ID number) or the book (identified by its title), respectively.

Because order enrichment may occur before data is available, the route is configured with an exception handler for the two NotFoundException exceptions that may occur, which logs the error, sets redelivery delay to 1.5s, and configures up to 10 redelivery attempts.