【发布时间】:2022-09-28 16:56:04
【问题描述】:
我想将本地文件发送到 hdfs。
public class FileRouteBuilder extends EndpointRouteBuilder {
@Override
public void configure() throws Exception {
from(file(\"C://Users/pcn/Desktop/test\").noop(true).recursive(true))
.process(new FileProcessor())
.to(hdfs(\"localhost:9000/2209212/\"))
.log(LoggingLevel.DEBUG, \"completed\");
}
}
所以,我是这样写的。但是,当我使用文件组件的递归选项时,发生文件路径错误。
java.lang.IllegalArgumentException: Illegal character in path at index 33: hdfs://localhost:9000/220922/rec\\test4.txt
at java.base/java.net.URI.create(URI.java:883)
at org.apache.camel.component.hdfs.HdfsInfoFactory.newFileSystem(HdfsInfoFactory.java:102)
at org.apache.camel.component.hdfs.HdfsInfoFactory.newHdfsInfoWithoutAuth(HdfsInfoFactory.java:63)
at org.apache.camel.component.hdfs.HdfsInfoFactory.newHdfsInfoWithoutAuth(HdfsInfoFactory.java:41)
at org.apache.camel.component.hdfs.HdfsOutputStream.createOutputStream(HdfsOutputStream.java:50)
at org.apache.camel.component.hdfs.HdfsProducer.doProcess(HdfsProducer.java:205)
at org.apache.camel.component.hdfs.HdfsProducer.process(HdfsProducer.java:188)
at org.apache.camel.support.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:66)
at org.apache.camel.processor.SendDynamicProcessor.lambda$process$0(SendDynamicProcessor.java:197)
at org.apache.camel.support.cache.DefaultProducerCache.doInAsyncProducer(DefaultProducerCache.java:318)
at org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:182)
at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:469)
at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:187)
at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:64)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:184)
at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:398)
at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:492)
at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:245)
at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:206)
at org.apache.camel.support.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:197)
at org.apache.camel.support.ScheduledPollConsumer.run(ScheduledPollConsumer.java:111)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
因为我在 Windows 上工作。
然后,我尝试使用处理器工具更改路径。
@Service
@Slf4j
public class FileProcessor implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
GenericFile body = exchange.getIn().getBody(GenericFile.class);
body.setEndpointPath(exchange.getIn().getBody(GenericFile.class).getEndpointPath().replace(\"\\\\/\", \"/\"));
body.setRelativeFilePath(exchange.getIn().getBody(GenericFile.class).getRelativeFilePath().replace(\"\\\\/\", \"/\"));
body.setAbsoluteFilePath(exchange.getIn().getBody(GenericFile.class).getAbsoluteFilePath().replace(\"\\\\/\", \"/\"));
exchange.getIn().setBody(body);
}
}
但是,它不起作用。当我使用递归选项时,我不认为来自Exchange 的子文件夹路径。
如何解决?
仅供参考,我也设置了属性并使用了toD。但是,结果是一样的。
-
您是否尝试将 \\ 更改为 / 从路径?我,e
.replace(\"\\\\\", \"/\") -
您可能还需要检查 Camel File 是否设置了骆驼 hdfs 使用的任何 message headers。 CamelFileName 可能是控制camel hdfs 存储文件的位置,因此可以将其修改为使用/ 而不是\\。快速 recursive=true 测试在 Windows 上产生了
CamelFileName=sub\\hmm.txt标头,因此可能就是这样。
标签: java apache-camel