Apache 如何在camel scala中构建从文件到websocket客户端的路由?

Apache 如何在camel scala中构建从文件到websocket客户端的路由?,apache,scala,apache-camel,Apache,Scala,Apache Camel,我需要读取/files目录下的文件,然后在websocket客户端上显示该文件的内容。这就是我在MyRouteBuilder.scala中所做的: import org.apache.camel.component.websocket.WebsocketComponent import org.apache.camel.{LoggingLevel, CamelContext, Exchange} import org.apache.camel.scala.dsl.builder.ScalaRou

我需要读取/files目录下的文件,然后在websocket客户端上显示该文件的内容。这就是我在MyRouteBuilder.scala中所做的:

import org.apache.camel.component.websocket.WebsocketComponent
import org.apache.camel.{LoggingLevel, CamelContext, Exchange}
import org.apache.camel.scala.dsl.builder.ScalaRouteBuilder

/**
 * A Camel Router using the Scala DSL
 */
class MyRouteBuilder(override val context : CamelContext) extends ScalaRouteBuilder(context) {

  // an example of a Processor method
  val myProcessorMethod = (exchange: Exchange) => {
    exchange.getIn.setBody("block test")
  }

  val ws = context.getComponent("websocket", classOf[WebsocketComponent]);
  ws.setPort(8444);
  ws.setHost("127.0.0.1")
  // we can serve static resources from the classpath: or file: system
  ws.setStaticResources("classpath:.");

  "file://files?noop=true" ==> {
    setBody(convertBodyTo(classOf[String]))
    to("websocket://127.0.0.1:8444/")
  }
}
但是,当我运行时,它会给出以下堆栈跟踪:

堆栈跟踪 java.lang.IllegalArgumentException:无法向单个连接发送消息;未设置连接键。 位于org.apache.camel.component.websocket.WebsocketProducer.process(WebsocketProducer.java:57) 位于org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) 位于org.apache.camel.processor.SendProcessor.process(SendProcessor.java:141) 位于org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) 位于org.apache.camel.processor.RedeliveryRorHandler.process(RedeliveryRorHandler.java:460) 位于org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) 位于org.apache.camel.processor.Pipeline.process(Pipeline.java:121) 位于org.apache.camel.processor.Pipeline.process(Pipeline.java:83) 位于org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) 位于org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:442) 位于org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:214) 位于org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:178) 位于org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174) 在org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)上 位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 位于java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) 位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) 位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 运行(Thread.java:745) [el-2)螺纹#0-file://files]GenericFileOnCompletion警告回滚文件策略:org.apache.camel.component.file.strategy。GenericFileRenameProcessStrategy@72611f35对于文件:GenericFile[acquisition.json] [el-2)螺纹#0-file://files]DefaultErrorHandler错误传递失败(ExchangeId:ID-vaisakh-ubuntu-45785-1455531433908-1-11上的MessageId:ID-vaisakh-ubuntu-45785-1455531433908-1-12)。传递尝试后耗尽:1捕获:java.lang.IllegalArgumentException:无法向单个连接发送消息;未设置连接键

消息历史记录 RouteId ProcessorId处理器已用时间(毫秒) [路线一][路线一][file://files?noop=true ] [ 2] [route1][convertBodyTo1][convertBodyTo[java.lang.String]] [route1][setBody1][setBody[{org.apache.camel.scala。ScalaExpression@f736069}] ] [ 0] [路线1][to1][websocket://127.0.0.1:8444/ ][1]

交换 交换[ Id-vaisakh-ubuntu-45785-1455531433908-1-12 仅交换模式 标题{breadcrumbId=ID-vaisakh-ubuntu-45785-1455531433908-1-11,CamelFileAbsolute=false,CamelFileAbsolutePath=/home/sagar/IdeaProjects/SampleIntegrationService/files/audition.json,CamelFileContentType=text/plain,CamelFileLastModified=1455526488000,CamelFileLength=150,CamelFileName=audition.json,CamelFileName=audition.jsony=audience.json,CamelFileParent=files,CamelFilePath=files/audience.json,CamelFileRelativePath=audience.json,CamelRedelivered=false,CamelRedeliveryCounter=0} BodyType org.apache.camel.scala.dsl.SRouteDefinition 车身SRouteDefinition(路线(路线1)[[From[file://files?noop=true]]->[ConvertBodyTo[java.lang.String],SetBody[{org.apache.camel.scala。ScalaExpression@f736069}],至[websocket://127.0.0.1:8444/]]],com.mediaiqdigital.sampleIntegrationService。MyRouteBuilder@67a27caa)
]

通过从标头设置连接键属性解决了此问题

 from(websocketUrl) ==> {

     setProperty("wsConnKey", header("websocket.connectionkey"))
     to("file://files?noop=true")
 }

 "file://files?noop=true" ==> {

     setBody(convertBodyTo(classOf[String]))
     to(WEBSOCKET_RESPONSE_ENDPOINT)
 }

 from(WEBSOCKET_REPONSE_ENDPOINT) ==> {

     process(new Processor() {
         void process(Exchange exchange) {
             Object connectionKey = exchange.getproperty("wsConnKey");
             Object exchangeBody = exchange.getIn().getBody();
             exchange.getOut().setHeader("wsConnKey", connectionKey);
             exchange.getOut().setBody(exchangeBody);
         }
     })
    to(websocketUrl)
 }