首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在camel-scala中建立从文件到websocket客户端的路由?

如何在camel-scala中建立从文件到websocket客户端的路由?
EN

Stack Overflow用户
提问于 2016-02-15 18:19:43
回答 1查看 441关注 0票数 2

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

代码语言:javascript
复制
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.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460)在org.apache.camel.processor.CamelInternalProcessor.process(在org.apache.camel.processor.Pipeline.process(Pipeline.java:121) at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:442) at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:214) at org)的CamelInternalProcessor.java:190)。apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:178) at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174) at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) atjava.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) el-2)线程#0 - file://files GenericFileOnCompletion WARN回滚文件策略: org.apache.camel.component.file.strategy.GenericFileRenameProcessStrategy@72611f35 java.lang.Thread.run Thread.java:745: GenericFileaudience.json DefaultErrorHandler发送失败错误(ExchangeId上的MessageId: ID-vaisakh-ubuntu-45785-1455531433908-1-11 : ID-vaisakh-ubuntu-45785-1455531433908-1-12)。尝试传递后耗尽:1捕获: java.lang.IllegalArgumentException:无法向单个连接发送消息;未设置连接键。

消息历史记录

file://files?noop=true route1 convertBodyTo[java.lang.String]中的RouteId ProcessorId Processor Elapsed (ms) route1 route1 convertBodyTo[java.lang.String]setBody[{org.apache.camel.scala.ScalaExpression@f736069}] route1 route1 websocket://127.0.0.1:8444/

交换

{breadcrumbId=ID-vaisakh-ubuntu-45785-1455531433908-1-11,,CamelFileAbsolutePath=/home/sagar/IdeaProjects/SampleIntegrationService/files/audience.json,CamelFileContentType= ExchangePattern / InOnly,CamelFileLastModified=1455526488000,CamelFileLength=150,CamelFileName=audience.json,CamelFileNameConsumed=audience.json,CamelFileNameOnly=audience.json,CamelFileParent=files,CamelFilePath= CamelFileAbsolute=false /InOnly,CamelFileRelativePath=audience.json,CamelRedelivered=false,com.mediaiqdigital.sampleIntegrationService.MyRouteBuilder@67a27caa),CamelRedeliveryCounter=0} BodyType org.apache.camel.scala.dsl.SRouteDefinition Body SRouteDefinition(Route(route1)[[Fromfile://files?noop=true] BodyType[BodyType,com.mediaiqdigital.sampleIntegrationService.MyRouteBuilder@67a27caa)CamelRedeliveryCounter=0://127.0.0.1:8444/]],BodyType org.apache.camel.scala.dsl.SRouteDefinition Body BodyType -> [ConvertBodyTojava.lang.String,87.0.0.1:8444/]]

EN

回答 1

Stack Overflow用户

发布于 2016-04-08 23:48:30

已通过设置标头中的连接密钥属性解决此问题。

代码语言:javascript
复制
 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)
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35406739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档