2014-03-14 82 views
2

我目前正在遵循http://doc.akka.io/docs/akka/snapshot/scala/camel.html中的akka​​-camel集成示例。阿卡駱駝發送案例類作爲消息

由於運輸我使用碼頭:HTTP,像

class Orders extends Actor with Producer { 
def endpointUri = "jetty:http://localhost:8877/" 
} 

同爲端點

class MyEndpoint extends Consumer { 
    def endpointUri = "jetty:http://0.0.0.0:8877/" 
    def receive = { 
    case msg: CamelMessage => { println("here", msg); sender ! "ok"} 
    case _     => { println("somewhere else") } 
    } 
} 

所有發送簡單的文本的消息像

val sys = ActorSystem("some-system") 
val orders = sys.actorOf(Props[Orders]) 
val endp = sys.actorOf(Props[MyEndpoint]) 

orders ? "hello" 

時工作正常但發送案例類時不起作用

case class B(id:String) 

orders ? B("hello") 

輸出狀態與TypeConversion錯誤

akka.camel.AkkaCamelException:沒有可用的類型轉換器轉換 從類型:de.spring.cases.infrastructure.SerializationSpec.B到所需的 類型:與的java.io.InputStream值B(你好) ...

引起:

org.apache.camel.NoTypeConversionAvailableException:無類型轉換器 可用於從類型: de.spring.cases.infrastructure.SerializationSpec.B轉換爲所需的 類型:值爲B(hello)的java.io.InputStream at org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:169) 在 org.apache.camel.component.jetty.JettyHttpProducer.createHttpExchange(JettyHttpProducer.java:135) 在 org.apache .camel.component.jetty.JettyHttpProducer.process(JettyHttpProducer.java:75) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) org.apache.camel.processor.SendProcessor $ 2.doInAsyncProducer(SendProcessor.java:122) 在 org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:298) 在 org.apache。 camel.processor.SendProcessor.process(SendProcessor.java:117) 在 akka.camel.ProducerSupport $ ProducerChild.produce(Producer.scala:137) 在 akka.camel.ProducerSupport $ $$ ProducerChild $ anonfun接收$ 1中。 applyOrElse(Producer.scala:111) ... 9個

當使用一個明確的(自己的)的序列化/反序列化betwee對象和數組[字節],事情進展順利。

我讀了關於駱駝TypeConversions並想知道,如果有一個內部的方式如何轉換消息從/到可序列化的對象。並且看到接收方,直接使用接收函數中的'正常'scala模式匹配來使用消息將是非常好的。沒有使用額外字段和手動轉碼的額外調度。

有什麼建議嗎?

回答

0

Camel code,正文內容需要是一個InputStream。所以你必須將B Object轉換爲InputStream並將其發送給Producer。在Java中完成像this

+0

這就是我所說的「手動」。同時我發現,將轉換添加到路線中可能會解決問題。但仍然有點手動。 – cybye