|
il y a 6 mois | |
---|---|---|
data | il y a 6 mois | |
scripts | il y a 6 mois | |
src | il y a 6 mois | |
.gitignore | il y a 6 mois | |
README.md | il y a 6 mois | |
pom.xml | il y a 6 mois |
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 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.
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.
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.
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.
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
.
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.