Apache 如何在camel scala中构建从文件到websocket客户端的路由?
我需要读取/files目录下的文件,然后在websocket客户端上显示该文件的内容。这就是我在MyRouteBuilder.scala中所做的: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
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)
}