This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 0ed82b6 Polish and cleanup documentation 0ed82b6 is described below commit 0ed82b6d5206d4e73b25297c22d44d34c2ec189b Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Wed Aug 11 16:58:50 2021 +0200 Polish and cleanup documentation --- .../user-manual/modules/ROOT/pages/expression.adoc | 25 +----- docs/user-manual/modules/ROOT/pages/predicate.adoc | 97 ++++++++++------------ docs/user-manual/modules/ROOT/pages/processor.adoc | 78 ++++++++++------- 3 files changed, 95 insertions(+), 105 deletions(-) diff --git a/docs/user-manual/modules/ROOT/pages/expression.adoc b/docs/user-manual/modules/ROOT/pages/expression.adoc index e00eab8..ebcfeb6 100644 --- a/docs/user-manual/modules/ROOT/pages/expression.adoc +++ b/docs/user-manual/modules/ROOT/pages/expression.adoc @@ -1,13 +1,13 @@ [[Expression-Expressions]] = Expressions -Expressions and Predicates can then be used to +Expressions and xref:predicate.adoc[Predicates] can then be used to create the various xref:{eip-vc}:eips:enterprise-integration-patterns.adoc[Enterprise Integration Patterns] in the xref:dsl.adoc[DSL] like with the xref:{eip-vc}:eips:recipientList-eip.adoc[Recipient List] EIP. To support dynamic rules Camel supports pluggable https://www.javadoc.io/doc/org.apache.camel/camel-api/current/org/apache/camel/Expression.html[Expression] -strategies using a variety of different Languages. +strategies using a variety of different xref:latest@components:languages:index.adoc[Languages]. == Expression API @@ -38,24 +38,3 @@ public interface Expression { } ------------------------------------------------------------------------------- -=== Predicate - -The API for a Camel Predicate is defined in the -`org.apache.camel.Predicate` interface as shown: - -[source,java] -------------------------------------------------------------------------------- -public interface Predicate { - - /** - * Evaluates the predicate on the message exchange and returns true if this - * exchange matches the predicate - * - * @param exchange the message exchange - * @return true if the predicate matches - */ - boolean matches(Exchange exchange); - -} -------------------------------------------------------------------------------- - diff --git a/docs/user-manual/modules/ROOT/pages/predicate.adoc b/docs/user-manual/modules/ROOT/pages/predicate.adoc index 6237f2f..1212c75 100644 --- a/docs/user-manual/modules/ROOT/pages/predicate.adoc +++ b/docs/user-manual/modules/ROOT/pages/predicate.adoc @@ -1,20 +1,42 @@ [[Predicate-Predicates]] = Predicates -Camel supports a pluggable interface called +xref:expression.adoc[Expressions] and Predicates can then be used to +create the various xref:{eip-vc}:eips:enterprise-integration-patterns.adoc[Enterprise +Integration Patterns] in the xref:dsl.adoc[DSL] like with the xref:{eip-vc}:eips:content-based-router-eip.adoc[Content Based Router] EIP. + +To support dynamic rules Camel supports pluggable https://www.javadoc.io/doc/org.apache.camel/camel-api/current/org/apache/camel/Predicate.html[Predicate] -which can be used to integrate a dynamic predicate into -xref:{eip-vc}:eips:enterprise-integration-patterns.adoc[Enterprise Integration -Patterns] such as when using the xref:{eip-vc}:eips:filter-eip.adoc[Message Filter] -or xref:{eip-vc}:eips:content-based-router-eip.adoc[Content Based Router]. +strategies using a variety of different xref:latest@components:languages:index.adoc[Languages]. + +== Predicate API -A Predicate is being evaluated to a boolean value so the result is -either `true` or `false`. This makes xref:predicate.adoc[Predicate] so +The API for a Camel Predicate is defined in the +`org.apache.camel.Predicate` interface as shown: + +[source,java] +------------------------------------------------------------------------------- +public interface Predicate { + + /** + * Evaluates the predicate on the message exchange and returns true if this + * exchange matches the predicate + * + * @param exchange the message exchange + * @return true if the predicate matches + */ + boolean matches(Exchange exchange); + +} +------------------------------------------------------------------------------- + +A `Predicate` is being evaluated to a boolean value so the result is +either `true` or `false`. This makes predicates so powerful as it is often used to control the routing of message in which path they should be routed. A simple example is to route an xref:exchange.adoc[Exchange] based on a -header value: +header value with the xref:{eip-vc}:eips:content-based-router-eip.adoc[Content Based Router] EIP: [source,java] ---- @@ -28,14 +50,14 @@ from("jms:queue:order") ---- In the route above the xref:predicate.adoc[Predicate] is the -`header("type").isEqualTo("widget")` as its constructed as an +`header("type").isEqualTo("widget")` as it is constructed as an xref:expression.adoc[Expression] that is evaluated as a -xref:predicate.adoc[Predicate]. To do this the various Builder classes +xref:predicate.adoc[Predicate]. To do this the various _Builder classes_ helps us here to create a nice and fluent syntax. `isEqualTo` is a builder method that returns a xref:predicate.adoc[Predicate] based on the input. -Sometimes the fluent builders can get long and a bit complex to read, +Sometimes the fluent builders can get long, and a bit complex to read, then you can just define your predicate outside the route and then just refer to the predicate in the route: @@ -57,7 +79,6 @@ from("jms:queue:order") .end(); ---- -[[Predicate-NegatingaPredicate]] == Negating a Predicate You can use the *not* method on the `PredicateBuilder` to negate a @@ -68,7 +89,7 @@ read: [source,java] ---- -import static org.apache.camel.builder.PredicateBuilder.not +import static org.apache.camel.builder.PredicateBuilder.not; ---- And then we can use it to enclose an existing predicate and negate it as @@ -83,14 +104,13 @@ from("direct:start") .end(); ---- -[[Predicate-CompoundPredicates]] == Compound Predicates You can also create compound predicates using boolean operators such as `and, or, not` and many others. -Currently this feature is only available in the Java-based DSLs, but not -in the Spring nor Blueprint DSLs. +Currently, this feature is only available in the Java-based DSLs, and not +in other DSLs such as XML. Using the https://www.javadoc.io/doc/org.apache.camel/camel-support/current/org/apache/camel/support/builder/PredicateBuilder.html[`PredicateBuilder`] @@ -103,10 +123,15 @@ based on logical operators and comparison operators: * `startsWith`, `endsWith` * `in` ("any of X predicates stands true") -Additionally, with `PredicateBuilder` you can create Regular Expressions +Additionally, with `PredicateBuilder` you can create regular expressions and use them as predicates, applying them to the result of an -expression, e.g. `PredicateBuilder.regex(header("foo"), "\d\{4}")` -applies the regular expression to the header = foo. +expression, e.g. + +[source,java] +---- +PredicateBuilder.regex(header("foo"), "\d\{4}"); +---- +applies the regular expression to the foo header. Combining different Expression Languages is also possible, e.g.: @@ -145,37 +170,3 @@ from("direct:start").choice() .end(); ---- -[[Predicate-ExtensiblePredicates]] -== Extensible Predicates - -Camel supports extensible Predicates using multiple -xref:languages.adoc[Languages]; the following languages are supported -out of the box - -* xref:components:languages:bean-language.adoc[Bean Language] for using Java for expressions -* xref:components:languages:constant-language.adoc[Constant] -* xref:components:languages:header-language.adoc[Header] -* xref:components:languages:jsonpath-language.adoc[JSonPath] -* xref:components:languages:mvel-language.adoc[Mvel] -* xref:components:languages:ognl-language.adoc[OGNL] -* xref:components:languages:ref-language.adoc[Ref Language] -* xref:components:languages:exchangeProperty-language.adoc[ExchangeProperty] -** xref:components:languages:groovy-language.adoc[Groovy] -* xref:components:languages:simple-language.adoc[Simple] -** xref:components:languages:file-language.adoc[File Language] -* xref:components:languages:spel-language.adoc[Spring Expression Language] -* xref:components:languages:tokenize-language.adoc[Tokenizer] -* xref:components:languages:xpath-language.adoc[XPath] -* xref:components:languages:xquery-language.adoc[XQuery] - -Most of these languages is also supported used as -xref:parameter-binding-annotations.adoc[Annotation Based -Expression Language]. - -You can easily write your own plugin predicate by implementing the -https://github.com/apache/camel/blob/main/core/camel-api/src/main/java/org/apache/camel/Predicate.java[Predicate -interface]. - -There are also a number of helper builders available such as the -https://github.com/apache/camel/blob/main/core/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java[PredicateBuilder -class] diff --git a/docs/user-manual/modules/ROOT/pages/processor.adoc b/docs/user-manual/modules/ROOT/pages/processor.adoc index 0c4fa57..184b787 100644 --- a/docs/user-manual/modules/ROOT/pages/processor.adoc +++ b/docs/user-manual/modules/ROOT/pages/processor.adoc @@ -3,23 +3,39 @@ The https://www.javadoc.io/doc/org.apache.camel/camel-api/current/org/apache/camel/Processor.html[Processor] -interface is used to implement consumers of message exchanges or to -implement a xref:{eip-vc}:eips:message-translator.adoc[Message Translator]. +interface is used for implement consumers of message exchanges or to +implement a xref:{eip-vc}:eips:message-translator.adoc[Message Translator], +and other use-cases. -[[Processor-Usingaprocessorinaroute]] == Using a processor in a route -Once you have written a class which implements processor like this... +Once you have written a class which implements processor like this: [source,java] ---- public class MyProcessor implements Processor { + public void process(Exchange exchange) throws Exception { // do something... } + } ---- +Then you can easily call this processor from a Java such as: + +[source,java] +---- +from("activemq:myQueue").process(MyProcessor.class); +---- + +Notice that the processor is referred to by the class type `MyProcessor.class` in the route. +Camel will during startup automatic create one new instance of the processor using xref:injector.adoc[Injector] +to be used during routing messages. + +In XML DSL however the `<process`> tag requires, referring to an existing processor instance +which can be done: + You can then easily use this inside a route by declaring the bean in Spring, say via the XML: @@ -28,32 +44,50 @@ Spring, say via the XML: <bean id="myProcessor" class="com.acme.MyProcessor"/> ---- -Then in Camel you can do: +And then use the bean id in the Camel route: + +[source,xml] +---- +<route> + <from uri="activemq:myQueue"/> + <process ref="myProcessor"/> +</route> +---- + +And in Java DSL: [source,java] ---- from("activemq:myQueue").process("myProcessor"); ---- -In your route you can also use the `process` DSL syntax for invoking a -processor. +=== Referring to beans using #class syntax + +In XML DSL you can also refer to the processor by its class name using `#class:` as prefix as shown: + +[source,xml] +---- +<route> + <from uri="activemq:myQueue"/> + <process ref="#class:com.acme.MyProcessor"/> +</route> +---- + +This also works in Java DSL: [source,java] ---- -Processor myProcessor = new MyProcessor(); -... -from("activemq:myQueue").process(myProcessor); +from("activemq:myQueue").process("#class:com.acme.MyProcessor"); ---- -If you need to lookup the processor in the xref:registry.adoc[Registry] -then you can do: +However in Java DSL you would often use the type safe way and provide the class type directly as previously shown: [source,java] ---- -from("activemq:myQueue").process("myProcessor"); +from("activemq:myQueue").process(MyProcessor.class); ---- -[[Processor-Whyuseprocesswhenyoucanusetoinstead]] + == Why use process when you can use to instead? The process can be used in routes as an anonymous inner class such: @@ -72,19 +106,5 @@ The process can be used in routes as an anonymous inner class such: This is usable for quickly whirling up some code. If the code in the inner class gets a bit more complicated it is of course advised to refactor it into a separate class. This approach is better if you do not want to use this processor again. -From reusability perspective, it is not recommended to follow this approach. - -[[Processor-TurningyourprocessorintoafullComponent]] -== Turning your processor into a full Component - -There is a base class called -https://www.javadoc.io/doc/org.apache.camel/camel-support/current/org/apache/camel/support/ProcessorEndpoint.html[ProcessorEndpoint] -which supports the full xref:endpoint.adoc[Endpoint] semantics given a -Processor instance. - -So you just need to create a xref:component.adoc[Component] class by -deriving from -https://www.javadoc.io/doc/org.apache.camel/camel-support/current/org/apache/camel/support/DefaultComponent.html[DefaultComponent] -which returns instances of ProcessorEndpoint. For more details see -xref:writing-components.adoc[Writing Components] +From reusability perspective, it is not recommended to use this approach with annonymois inner classes.