2014-03-14 40 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