【问题标题】:camel-hdfs: How to avoid Illegal character in path?camel-hdfs:如何避免路径中的非法字符?
【发布时间】: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


【解决方案1】:

如果您想在将文件注入 HDFS 之前修改相对路径,您可以修改标头 CamelFileName(您可以从常量 HdfsConstants.FILE_NAME 中获取)以满足您的要求。

所以在你的情况下,你的 Processor 可能是这样的:

public class FileProcessor implements Processor {

    @Override
    public void process(Exchange exchange) {
        exchange.getIn().setHeader(
            HdfsConstants.FILE_NAME,
            exchange.getIn().getHeader(HdfsConstants.FILE_NAME, String.class)
                .replace('\\', '/')
        );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 2011-01-06
    • 2011-01-27
    • 2012-03-05
    • 2018-02-28
    相关资源
    最近更新 更多