路由:
Camel支持用java dsl定义路由规则,使用RouteBuilder。
示例:
RouteBuilder builder = new RouteBuilder() {
public void configure() {
errorHandler(deadLetterChannel("mock:error"));
from("direct:a").to("direct:b");
}
};
从上例可以看出camel使用URI来串起endpoint
URI字符格式:
格式化endpoint的URI
from("direct:start").toF("file://%s?fileName=%s", path, name);
fromF("file://%s?include=%s", path, pattern).toF("mock:%s", result);
Filters
You can combine simple routes with filters which can be arbitrary Predicate implementations.
RouteBuilder builder =
new
RouteBuilder() {
public
void
configure() {
errorHandler(deadLetterChannel(
"mock:error"
));
from(
"direct:a"
)
.filter(header(
"foo"
).isEqualTo(
"bar"
))
.to(
"direct:b"
);
}
};
|
Choices
With a choice you provide a list of predicates and outcomes along with an optional default otherwise clause which is invoked if none of the conditions are met.
RouteBuilder builder =
new
RouteBuilder() {
public
void
configure() {
errorHandler(deadLetterChannel(
"mock:error"
));
from(
"direct:a"
)
.choice()
.when(header(
"foo"
).isEqualTo(
"bar"
))
.to(
"direct:b"
)
.when(header(
"foo"
).isEqualTo(
"cheese"
))
.to(
"direct:c"
)
.otherwise()
.to(
"direct:d"
);
}
};
|
Using a custom processor
Here is an example of using a custom Processor
myProcessor =
new
Processor() {
public
void
process(Exchange exchange) {
log.debug(
"Called with exchange: "
+ exchange);
}
};
RouteBuilder builder =
new
RouteBuilder() {
public
void
configure() {
errorHandler(deadLetterChannel(
"mock:error"
));
from(
"direct:a"
)
.process(myProcessor);
}
};
|
You can mix and match custom processors with filters and choices.
RouteBuilder builder =
new
RouteBuilder() {
public
void
configure() {
errorHandler(deadLetterChannel(
"mock:error"
));
from(
"direct:a"
)
.filter(header(
"foo"
).isEqualTo(
"bar"
))
.process(myProcessor);
}
};
|
Interceptors
Here is an example of adding a few custom InterceptorProcessor objects to a processing pipeline:
RouteBuilder builder =
new
RouteBuilder() {
public
void
configure() {
errorHandler(deadLetterChannel(
"mock:error"
));
from(
"direct:a"
)
.filter(header(
"foo"
).isEqualTo(
123
))
.to(
"direct:b"
);
}
};
|
When you start defining and interceptor stack with intercept(), you must follow up with the subsequent .target() so that the target of the interceptor stack is properly registered.