【问题标题】:akka camel sending case classes as messagesakka camel 将案例类作为消息发送
【发布时间】:2014-04-19 10:52:14
【问题描述】:

我目前正在关注 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 class B(id:String)

orders ? B("hello")

输出表明 TypeConversion 出错

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

原因:

org.apache.camel.NoTypeConversionAvailableException: 没有类型转换器 可从类型转换: de.spring.cases.infrastructure.SerializationSpec.B 到所需 类型:java.io.InputStream,值为 B(hello) 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$receive$1.applyOrElse(Producer.scala:111) ... 9 更多

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

我阅读了有关 Camels TypeConversions 的信息,想知道是否有一种内部方法可以将消息从/到可序列化对象进行转码。并且看到接收方,在接收函数中使用“正常”scala 模式匹配直接使用消息会很棒。无需使用额外字段和手动转码进行任何额外调度。

有什么建议吗?

【问题讨论】:

    标签: java scala serialization apache-camel akka


    【解决方案1】:

    Camel code 开始,正文内容需要是一个InputStream。所以你必须将 B Object 转换为 InputStream 并发送给 Producer。在 Java 中就像 this

    【讨论】:

    • 这就是我所说的“手动”。同时我发现,将转换添加到路线可能会解决问题。但仍然有点手动。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2012-07-11
    • 2014-12-30
    相关资源
    最近更新 更多