akka camel发送案例类作为消息

时间:2014-03-14 08:48:04

标签: java scala serialization apache-camel akka

我目前正在关注http://doc.akka.io/docs/akka/snapshot/scala/camel.html中的akka​​-camel集成示例。

作为运输我使用jetty: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-Classes时,事情不起作用

case class B(id:String)

orders ? B("hello")

输出使用TypeConversion

表示错误
  

akka.camel.AkkaCamelException:没有可用于转换的类型转换器   从类型:de.spring.cases.infrastructure.SerializationSpec.B到   必需类型:java.io.InputStream,其值为B(hello)   ...

引起:

  

org.apache.camel.NoTypeConversionAvailableException:没有类型转换器   可以转换类型:   de.spring.cases.infrastructure.SerializationSpec.B到必需的   type:java.io.InputStream,其值为B(hello)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)     在   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更多

在Object和Array [Byte]之间使用显式(自己的)序列化/反序列化时,事情进展顺利。

我读到了Camels TypeConversions并且想知道,如果有一种内部方式如何将消息从/向可序列化对象转码。看到收件人方面,直接使用' normal'直接使用邮件会很棒。接收函数中的scala模式匹配。无需使用其他字段和手动转码进行任何其他调度。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

Camel code开始,正文内容需要是一个InputStream。因此,您必须将B对象转换为InputStream并将其发送到Producer。在Java中完成this