当前位置: 首页 > 知识库问答 >
问题:

Apache Camel:属性和属性占位符无效的RecipientList

祁渊
2023-03-14

我正在尝试使用骆驼JavaDSL将文件路由到SFTP服务器,如下所示:

.recipientList(simple("sftp://{{hostname}}:{{port}}/" + exchangeProperty(destinationDir) + "?username={{username}}&preferredAuthentications=publickey&privateKeyFile={{pkfilelocation}}&privateKeyPassphrase={{pkPassphrase}}"))

但是,当消息到达此终结点时,Camel 会引发以下异常:

 org.apache.camel.component.file.GenericFileOperationFailedException: Cannot change directory to: exchangeProperty{destinationDir}
    at org.apache.camel.component.file.remote.SftpOperations.doChangeDirectory(SftpOperations.java:596)
    at org.apache.camel.component.file.remote.SftpOperations.changeCurrentDirectory(SftpOperations.java:584)
    at org.apache.camel.component.file.remote.SftpOperations.storeFile(SftpOperations.java:830)
    at org.apache.camel.component.file.GenericFileProducer.writeFile(GenericFileProducer.java:277)
    at org.apache.camel.component.file.GenericFileProducer.processExchange(GenericFileProducer.java:165)
    at org.apache.camel.component.file.remote.RemoteFileProducer.process(RemoteFileProducer.java:58)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:110)
    at org.apache.camel.builder.NoErrorHandlerBuilder$1.process(NoErrorHandlerBuilder.java:40)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:695)
    at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:623)
    at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:247)
    at org.apache.camel.processor.RecipientList.sendToRecipientList(RecipientList.java:172)
    at org.apache.camel.processor.RecipientList.process(RecipientList.java:132)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:110)
    at org.apache.camel.builder.NoErrorHandlerBuilder$1.process(NoErrorHandlerBuilder.java:40)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:695)
    at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:623)
    at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:247)
    at org.apache.camel.processor.Splitter.process(Splitter.java:114)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)
    at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:112)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:721)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:681)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:651)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:317)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:255)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1166)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1158)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1055)
    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:748)
Caused by: 2: No such file
    at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2873)
    at com.jcraft.jsch.ChannelSftp._realpath(ChannelSftp.java:2367)
    at com.jcraft.jsch.ChannelSftp.cd(ChannelSftp.java:342)
    at org.apache.camel.component.file.remote.SftpOperations.doChangeDirectory(SftpOperations.java:594)
    ... 53 more

我可以看到在堆栈跟踪中打印的交易所上设置了目标目录属性。如果我替换

  • exchangeProperty(destinationDir)

在具有实际目标目录(tmp/目标/dir 1/)的路由中,它工作正常。问题是,我需要目标目录是动态的。我尝试过在路由中使用${exchangeProperty.destinationDir}

在调试Camel SFTP库时,我可以在SftpOperations中看到这一点。类:594,路径设置为exchangeProperty{destinationDir}。这并没有被取代,这就是它失败的原因。

注意:我在{{port}}(而不是在destinationDir属性中)后面使用了/符号,因为否则,Camel SFTP组件会抛出一个异常,指出主机未定义。

有人对如何获取属性占位符和交换属性以与SFTP动态工作有任何建议吗?我也尝试过d(“…”),但运气不好。

卡梅尔夫 2.19.0

共有1个答案

芮立果
2023-03-14

我尝试了许多.toD,.inOnly,.to,.recipientList等的变体,但没有运气。我确实找到了一个简单的解决方法,但是对于遭受同样挫败感的任何人:

.process(new Processor() {
    @Override
    public void process(Exchange exchange) throws Exception {
        exchange.setProperty("myHackProperty", String.format("sftp://{{hostname}}:{{port}}/%s)", exchange.getProperty("dest‌‌​​inationDir")) 
    }
}

.recipientList(exchangeProperty("myHackProperty"))

简单的手动动态字符串替换。就像一个魅力。有时编码camel的最佳方法是避免camel:)

 类似资料:
  • 我不明白为什么不能在Spring-Boot中向application.properties文件中注入值。外部属性添加到logging.file变量中。我有一个application.properties文件,看起来如下所示 具有相应的Spring-boot应用程序类 请注意,如果我自己注入服务器端口号,那么在注入和启动应用程序时没有任何问题。 我在这个问题上兜圈子,弄不清自己做错了什么。

  • 问题内容: 有谁知道我是否应该可以在预选赛中使用属性占位符作为表达式?我似乎无法正常工作。 我正在使用Spring 3.0.4。 XML: config.properties: 问题答案: 这可行。如果仅使用默认的spring bean名称,则可以省略服务名称。serviceA与ServiceA等 XML: Props:

  • 问题内容: 我有我的配置: 我得到错误 我知道这可能缺少属性文件,但是我在类路径中恰好有它。有什么不见了? 我的web.xml: 问题答案: 你的应用程序中可能有多个。尝试在超类的方法上设置一个断点,看看在应用程序启动时是否多次调用了该断点。如果不止一个,则可能需要查看配置属性,以便你的应用程序可以正常启动。

  • 我的数据库配置类: 和AppConfig: } 嗨,我上面有个错误,我不知道怎么修复,你能帮我吗?在添加这个bean之前,我的项目运行良好: }

  • 我有一个SpringBoot应用程序。对于Thymeleaf,对于此属性文件: 在控制器上: 在模板上: 但我在浏览器上看到:

  • 问题内容: 我正在使用读取属性文件。如何以编程方式访问它们(不起作用-开发时我不知道产权)? 主要问题是我无法更改文件,因为它是由“父”框架设置的 ps。很奇怪,但是回来了 问题答案: 是一个,在bean创建过程中仅是“活动的”。遇到符号时,它将尝试根据其内部属性来解决该问题,但不会使这些属性对容器可用。 就是说:类似的问题一遍又一遍地出现,建议的解决方案通常是子类化,并使Properties手动