概述:在用camel编程前,必须理解消息和消息交换体是什么意思。camel可以处理多种消息格式,基本的消息格式被设计成一个抽象格式。camel提供的API用于访问和转化消息格式。
交换体:交换体对象封装了接受到的消息和交换体本身的属性。如果消息被路由给目标endpoint,交换体提供临时的消息槽来存放返回的消息。
交换体支持lazy的消息生成模式,也就是只有在调用某些get方法时,才会将对应的消息对象生成。
消息:消息分消息体、消息头、消息附件,其中消息体和消息头是任意类型的对象。消息附件的类型是:javax.activation.DataHandler。camel的一个重要特征就是支持消息头和消息体得lazy创建,也就是意味着,只有使用才会创建,如果不解析头和体,那么数据流可以直接穿过camel,不做任何改变。
message的接口名是:org.apache.camel.Message。可以通过该接口访问消息头,消息体和消息附件。
消息体,消息头,消息附件,消息id的创建,都可以采用lazy的模式,这样的话,就会最大限度的减少系统性能消耗。但是,对于某些endpoint来说,它会隐式调用getMessageId的方法,比如JMS类型的endpoint,那么MessagId就会生成了。
in message的消息格式取决于sourceURL,out message的消息格式取决于targetURL,camel创建的消息体采用原始格式,例如:byte[],inputStream,outputStream等。这样可以确保开销最小化。
可以通过类型转换,将消息体得原始类型,方便地转化为需要的类型:
- from("SourceURL").convertBodyTo(String.class).to("TargetURL");
- from("SourceURL").setBody(bodyAs(String.class).append("My Special Signature")).to("TargetURL");
- from("SourceURL").setBody(body().append("My Special Signature")).to("TargetURL");
- getBody(Class<T> type)—Returns the message body as type, T.
- getHeader(String name, Class<T> type)—Returns the named header value as type, T.
可以将消息体转化为xml的document:但是要保证消息是xml格式的,并且这种转化的代价是昂贵的。
采用了org.w3c.dom.Document.
编组与反编组:
编组的调用可以将一个高阶层的对象转换为第阶层的对象,而反编组则反之。我们可以使用两个processor来实现:
marshal():编组,unmarshal():反编组。
例如:从文件系统读取一个序列化的对象文件,将其反编组成一个java对象
- from("file://tmp/appfiles/serialized")
- .unmarshal()
- .serialization()
- .<FurtherProcessing>
- .to("TargetURL");
最终的消息格式:
当in message抵达路由终点,tarage endpoint必须能够转换消息体为一种可以被写入到物理endpoint的格式。同样的规则适用于out message回到source endpoint。这种转换通常是隐式执行的。典型地,这种类型转化器的调用就是:从一种低层次的格式转化为另一种低层次的格式:byte[]到InputStream。
内置的类型转换器:
可以采用Message.getBody(Class<T> type)或者Message.getHeader(String name,Class<T> type)来实现类型转换。
也可以采取显式的转换方式:
org.apache.camel.TypeConverter tc = exchange.getContext().getTypeConverter();
String str_var = tc.convertTo(String.class,value);
不是所有类型都可以进行内部转换的。内置的转换器主要聚焦在对File和String的转换上。
可以\使用Exchange.CHARSET_NAME显式地指明字符编码,从而将字节数组转换为字符。例如:exchange.setProperty("Exchange.CHARSET_NAME","UTF-8");
在java.nio.charset.chaset类中有对支持的字符集的描述。
可以集合类型的转换:
Object[],java.util.set,java.util.List。
可以map类型的转换:
java.util.Map,java.util.HashMap,java.util.Hashtable,java.util.Properties
DOM类型转换:
org.w3c.dom.Document,org.w3c.dom.Node,java.xml.transform.dom.DOMSource...
SAX类型转换:
可以从String,InputStream,Source,StreamSource,DOMSource转换为:javax.xml.transform.sax.SAXSource。
转载于:https://blog.51cto.com/nepoulia/548535