A number of example Camel Routes are available in the fcrepo-camel project, along with numerous production-ready projects in fcrepo-camel-toolbox. Below are some additional Camel Routes to get you started.
LDPath Transformations
If an fcr:transform
program has been installed as mytransform
, you can generate a JSON representation of a container and send it to a low-latency, highly available document store, such as Riak. The following route determines if a container has been removed or simply added/updated. It then routes the message appropriately to a load-balancer sitting in front of the Riak HTTP endpoint.
...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | val riakKeyProcessor = (exchange : Exchange) = > { exchange.getIn.setHeader( Exchange.HTTP _ PATH, "/buckets/fcrepo/keys/" + URLEncoder.encode(exchange.getIn.getHeader( "org.fcrepo.jms.identifier" , classOf[String])) ) } "activemq:topic:fedora" == > { choice() { when( _ .in( "org.fcrepo.jms.eventType" ) == "http://fedora.info/definitions/v4/repository#NODE_REMOVED" ) { setHeader(Exchange.HTTP _ METHOD, constant( "DELETE" )) process(riakKeyProcessor) to( "http4:localhost:8098" ) } otherwise() { to( "fcrepo:localhost:8080/fedora/rest" ) filter(xpathFilter) { to( "fcrepo:localhost:8080/fedora/rest?accept=application/json&transform=mytransform" ) setHeader(Exchange.HTTP _ METHOD, constant( "PUT" )) process(riakKeyProcessor) to( "http4:localhost:8098" ) } } } } |
External Triplestore
Some additional processing must be done to transform an application/n-triples
response into a validapplication/sparql-update
payload before sending to an external triplestore such as Fuseki or Sesame. The fcrepo component contains some processors in org.fcrepo.camel.processor
to handle this case. The examples below assume that messages have already been routed based on eventType
(see below) and passed to the appropriate queue.
...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from( "direct:delete" ) .process( new SparqlDescribeProcessor()) .to( "http4:localhost:3030/db/query" ) .process( new SparqlDeleteProcessor()) .to( "http4:localhost:3030/db/update" ); from( "direct:new" ) .to( "fcrepo:localhost:8080/rest" ) .process( new SparqlInsertProcessor()) .to( "http4:localhost:3030/db/update" ); from( "direct:update" ) .to( "fcrepo:localhost:8080/rest" ) .process( new SparqlUpdateProcessor()) .to( "http4:localhost:3030/db/update" ); |
Event-based Routing
It is often helpful to route messages to different queues based on the eventType
value. This example splits messages oneventType
values and routes the messages to appropriate queues. Following this example, it would be prudent to aggregate the messages based on org.fcrepo.jms.identifier
value after retrieving the messages from the downstream queues.
...