java camel exchange类_Exchange服务器之camel 基本概念

本文将带你了解Exchange服务器之camel 基本概念,希望本文对大家学Exchange有所帮助。

camel 对exchange的几种处理consuming方式:

1. bean

2. beanRef :     beanRef("myTransformerBean"

, "myMethodName"

)

3.process:

.process(new

Processor() {

public

void process(Exchange exchange) {

Message in = exchange.getIn();

in.setBody(in.getBody(String

.class) + " World!"

);

}

})

4. transform :

.transform(body().append(" World!"))5.Templating (velocity  , xquery):use InOut (request-reply) semantics:to process requests on the My.Queue queue on ActiveMQ with a template generated response,then sending responses back to the JMSReplyTo Destination you could use this:       to("velocity:com/acme/MyResponse.vm")(1)velocity

Velocity

The velocity:

component allows you to process a message using an Apache Velocity

template. This can be ideal when using Templating

to generate responses for requests.

Maven users will need to add the following dependency to their pom.xml

for this component:

org.apache.camel

camel-velocity

x.x.x

URI format

velocity:templateName[?options]

Where templateName

is the classpath-local URI of the template to invoke; or the complete URL of the remote template (eg: file://folder/myfile.vm

).

You can append query options to the URI in the following format, ?option=value&option=value&...

Options

Option

Default

Description

loaderCache

true

Velocity based file loader cache.

contentCache

New option in Camel 1.4: Cache for the resource content when it is loaded. By default, it's false

in Camel 1.x. By default, it's true

in Camel 2.x.

encoding

null

New option in Camel 1.6: Character encoding of the resource content.

propertiesFile

null

New option in Camel 2.1: The URI of the properties file which is used for VelocityEngine initialization.

Message Headers

The velocity component sets a couple headers on the message (you

can't set these yourself and from Camel 2.1 velocity component will not

set these headers which will cause some side effect on the dynamic

template support):

Header

Description

org.apache.camel.velocity.resource

Camel 1.x: The resource as an org.springframework.core.io.Resource

object.

org.apache.camel.velocity.resourceUri

Camel 1.x: The templateName

as a String

object.

CamelVelocityResource

Camel 2.0: The resource as an org.springframework.core.io.Resource

object.

CamelVelocityResourceUri

Camel 2.0: The templateName

as a String

object.

In Camel 1.4 headers set during the Velocity evaluation are returned

to the message and added as headers. Then its kinda possible to return

values from Velocity to the Message.

For example, to set the header value of fruit

in the Velocity template .tm

:

$in.setHeader('fruit', 'Apple')

The fruit

header is now accessible from the message.out.headers

.

Velocity Context

Camel will provide exchange information in the Velocity context (just a Map

). The Exchange

is transfered as:

key

value

exchange

The Exchange

itself.

headers

The headers of the In message.

camelContext

The Camel Context intance.

request

The In message.

in

The In message.

body

The In message body.

out

The Out message (only for InOut message exchange pattern).

response

The Out message (only for InOut message exchange pattern).

Hot reloading

The Velocity template resource is, by default, hot reloadable for both file and classpath resources (expanded jar). If you set contentCache=true

,

Camel will only load the resource once, and thus hot reloading is not

possible. This scenario can be used in production, when the resource

never changes.

Dynamic templates

Available as of Camel 2.1

Camel provides two headers by which you can define a different resource

location for a template or the template content itself. If any of these

headers is set then Camel uses this over the endpoint configured

resource. This allows you to provide a dynamic template at runtime.

Header

Type

Description

CamelVelocityResourceUri

String

Camel 2.1:

A URI for the template resource to use instead of the endpoint configured.

CamelVelocityTemplate

String

Camel 2.1:

The template to use instead of the endpoint configured.

Samples

For example you could use something like

from("activemq:My.Queue").  to("velocity:com/acme/MyResponse.vm");

To use a Velocity template to formulate a response to a message for InOut message exchanges (where there is a JMSReplyTo

header).

If you want to use InOnly and consume the message and send it to another destination, you could use the following route:

from("activemq:My.Queue").  to("velocity:com/acme/MyResponse.vm").  to("activemq:Another.Queue");

And to use the content cache, e.g. for use in production, where the .vm

template never changes:

from("activemq:My.Queue").  to("velocity:com/acme/MyResponse.vm?contentCache=true").  to("activemq:Another.Queue");

And a file based resource:

from("activemq:My.Queue").  to("velocity:file://myfolder/MyResponse.vm?contentCache=true").  to("activemq:Another.Queue");

In Camel 2.1

it's possible to specify what template the component should use dynamically via a header, so for example:

from("direct:in").  setHeader("CamelVelocityResourceUri").constant("path/to/my/template.vm").  to("velocity:dummy");

In Camel 2.1

it's possible to specify a template directly as a header the component should use dynamically via a header, so for example:

from("direct:in").  setHeader("CamelVelocityTemplate").constant("Hi this is a velocity template that can do templating ${body}").  to("velocity:dummy");

The Email Sample

In this sample we want to use Velocity templating for an order

confirmation email. The email template is laid out in Velocity as:

Dear ${headers.lastName}, ${headers.firstName}Thanks for the order of ${headers.item}.Regards Camel Riders Bookstore${body}

And the java code:

private Exchange createLetter() {    Exchange exchange = context.getEndpoint("direct:a").createExchange();    Message msg = exchange.getIn();    msg.setHeader("firstName", "Claus");    msg.setHeader("lastName", "Ibsen");    msg.setHeader("item", "Camel in Action");    msg.setBody("PS: Next beer is on me, James");return exchange;}@Testpublic void testVelocityLetter() throws Exception {    MockEndpoint mock = getMockEndpoint("mock:result");    mock.expectedMessageCount(1);    mock.expectedBodiesReceived("Dear Ibsen, Claus/n/nThanks for the order of Camel in Action./n/nRegards Camel Riders Bookstore/nPS: Next beer is on me, James");    template.send("direct:a", createLetter());    mock.assertIsSatisfied();}protected RouteBuilder createRouteBuilder() throws Exception {return new RouteBuilder() {public void configure() throws Exception {            from("direct:a").to("velocity:org/apache/camel/component/velocity/letter.vm").to("mock:result");        }    };}

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标系统运维之Exchange频道!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值