PythonCamel supports Python among other Scripting Languages to allow an Expression or Predicate to be used in the DSL or Xml Configuration. To use a Python expression use the following Java code
... python("somePythonExpression") ...
For example you could use the python function to create an Predicate in a Message Filter or as an Expression for a Recipient List ExampleIn the sample below we use Python to create a Predicate use in the route path, to route exchanges from admin users to a special queue.
from("direct:start")
.choice()
.when().python("request.headers['user'] == 'admin'").to("seda:adminQueue")
.otherwise()
.to("seda:regularQueue");
And a Spring DSL sample as well:
<route>
<from uri="direct:start"/>
<choice>
<when>
<python>request.headers['user'] == 'admin'</python>
<to uri="seda:adminQueue"/>
</when>
<otherwise>
<to uri="seda:regularQueue"/>
</otherwise>
</choice>
</route>
ScriptContextThe JSR-223 scripting languages ScriptContext is pre configured with the following attributes all set at ENGINE_SCOPE:
AttributesYou can add your own attributes with the attribute(name, value) DSL method, such as: In the sample below we add an attribute user that is an object we already have instantiated as myUser. This object has a getFirstName() method that we want to set as header on the message. We use the groovy language to concat the first and last name into a single string that is returned. from("direct:in").setHeader("name").groovy("'$user.firstName $user.lastName'").attribute("user", myUser).to("seda:users"); Any scripting languageCamel can run any JSR-223 scripting languages using the script DSL method such as: from("direct:in").setHeader("firstName").script("jaskel", "user.firstName").attribute("user", myUser).to("seda:users"); This is a bit different using the Spring DSL where you use the expression element that doesn't support setting attributes (yet):
<from uri="direct:in"/>
<setHeader headerName="firstName">
<expression language="jaskel">user.firstName</expression>
</setHeader>
<to uri="seda:users"/>
You can also use predicates e.g. in a Filter:
<filter>
<language language="beanshell">request.getHeaders().get("Foo").equals("Bar")</language>
<to uri="direct:next" />
</filter>
See Scripting Languages for the list of languages with explicit DSL support. Some languages without specific DSL support but known to work with these generic methods include:
Additional arguments to ScriptingEngineAvailable as of Camel 2.8 You can provide additional arguments to the ScriptingEngine using a header on the Camel message with the key CamelScriptArguments. public void testArgumentsExample() throws Exception { if (!ScriptTestHelper.canRunTestOnThisPlatform()) { return; } getMockEndpoint("mock:result").expectedMessageCount(0); getMockEndpoint("mock:unmatched").expectedMessageCount(1); // additional arguments to ScriptEngine Map<String, Object> arguments = new HashMap<String, Object>(); arguments.put("foo", "bar"); arguments.put("baz", 7); // those additional arguments is provided as a header on the Camel Message template.sendBodyAndHeader("direct:start", "hello", ScriptBuilder.ARGUMENTS, arguments); assertMockEndpointsSatisfied(); } Using properties functionAvailable as of Camel 2.9 If you need to use the Properties component from a script to lookup property placeholders, then its a bit cumbersome to do so. .setHeader("myHeader").groovy("context.resolvePropertyPlaceholders('{{' + request.headers.get('foo') + '}}')") From Camel 2.9 onwards you can now use the properties function and the same example is simpler: .setHeader("myHeader").groovy("properties.resolve(request.headers.get('foo'))") Loading script from external resourceAvailable as of Camel 2.11 You can externalize the script and have Camel load it from a resource such as "classpath:", "file:", or "http:". .setHeader("myHeader").groovy("resource:classpath:mygroovy.groovy") DependenciesTo use scripting languages in your camel routes you need to add the a dependency on camel-script which integrates the JSR-223 scripting engine. If you use maven you could just add the following to your pom.xml, substituting the version number for the latest & greatest release (see the download page for the latest versions). <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-script</artifactId> <version>x.x.x</version> </dependency> |