概述:在用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等。这样可以确保开销最小化。

可以通过类型转换,将消息体得原始类型,方便地转化为需要的类型:

 

 
  
  1. from("SourceURL").convertBodyTo(String.class).to("TargetURL");  
  2.  
  3. from("SourceURL").setBody(bodyAs(String.class).append("My Special Signature")).to("TargetURL");  
  4.  
  5. from("SourceURL").setBody(body().append("My Special Signature")).to("TargetURL");  
  6.  
  7. getBody(Class<T> type)—Returns the message body as type, T.  
  8.  
  9. 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对象

 

 
  
  1. from("file://tmp/appfiles/serialized")  
  2.     .unmarshal()  
  3.     .serialization()  
  4.     .<FurtherProcessing>  
  5.     .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。