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

为什么我的财产在这条驼峰sftp路线中没有得到解决?

太叔高义
2023-03-14

我正在创建一个camel路由,它从本地服务器读取文件,添加一些头,然后将内容写入另一个远程sftp服务器上的文件。

我动态设置的标题之一是登录最终服务器所需的用户名。然而,当连接发生时,我可以看到我设置的用户名没有用于登录,而是使用文字值“${in.header.senderTargetUserName}”。该属性尚未解析。

这是代码

@Override
public void configure() throws Exception {

    from(fromWorkInDirectoryEndpoint())
                    .transacted()
                    .process(new SetCustomFileName())
                    .process(new SetSenderTargetUsername())
                    .to(targetProvideFileEndpoint());

    private String targetProvideFileEndpoint() {
        return "sftp://${in.header.senderTargetUserName}@{{target.sftp-core.server}}/{{target.environment.inDirectory}}?disconnect=true&privateKeyUri=/certificate/private.key&fileName=${in.header.customFileName}";
    }
}

public class SetCustomFileName implements Processor {
    @Override
    public void process(Exchange exchange) throws Exception {

            final String userId = exchange.getIn().getHeader(CAMEL_FILE_NAME, String.class).replaceAll("/" + sentFileName, "");

            exchange.getIn().setHeader(CUSTOM_FILE_NAME, "a_custom_file_name.txt");
            exchange.getIn().setHeader(USER_ID, userId);
    }
}

public class SetSenderTargetUsername implements Processor {
    @Override
    public void process(Exchange exchange) throws Exception {
        final String userId = exchange.getIn().getHeader(USER_ID, String.class);

        User user = userService.findOne(userId);
        exchange.getIn().setHeader("senderTargetUserName", user.getUserNameThatShouldBeUsedOnSftp());
    }
}

我有一个例外:

Exchange
---------------------------------------------------------------------------------------------------------------------------------------
Exchange[
    Id                  ID-DESKTOP-HRMD8N6-54673-1455104133665-0-406
    ExchangePattern     InOnly
    Headers             {customFileName=a-custom-filename.txt, userId=6bb37a77-6f74-4410-8043-26f96ce06be0, senderTargetUserName=USERNAME}
    BodyType            org.apache.camel.component.file.remote.RemoteFile
    Body                [Body is file based: RemoteFile[6bb37a77-6f74-4410-8043-26f96ce06be0/FI.DIMN.108853.20160210.00013.T.1.1]]
]

2016-02-10 13:10:13.550 DEBUG 5356 --- [lan.be/work/in/] o.a.c.c.file.remote.RemoteFileProducer   : Could not connect to: Endpoint[sftp://$%7Bin.header.senderTargetUserName%7D@destinationFileServer:8520/INTEST?disconnect=true&fileName=%24%7Bin.header.customFileName%7D&privateKeyUri=%2Fcertificate%2Fprivate.key]. Will try to recover.

org.apache.camel.component.file.GenericFileOperationFailedException: Cannot connect to sftp://${in.header.senderTargetUserName}@sftp.socialsecurity.be:8022
    at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:146)
    at org.apache.camel.component.file.remote.RemoteFileProducer.connectIfNecessary(RemoteFileProducer.java:202)
    at org.apache.camel.component.file.remote.RemoteFileProducer.recoverableConnectIfNecessary(RemoteFileProducer.java:172)
    at org.apache.camel.component.file.remote.RemoteFileProducer.preWriteCheck(RemoteFileProducer.java:126)
    at org.apache.camel.component.file.GenericFileProducer.processExchange(GenericFileProducer.java:113)
    at org.apache.camel.component.file.remote.RemoteFileProducer.process(RemoteFileProducer.java:56)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:157)
    at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:304)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:152)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:329)
    at org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:56)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:165)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.spring.spi.TransactionErrorHandler.processByErrorHandler(TransactionErrorHandler.java:218)
    at org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:99)
    at org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:112)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.spring.spi.TransactionErrorHandler.processByErrorHandler(TransactionErrorHandler.java:218)
    at org.apache.camel.spring.spi.TransactionErrorHandler$1.doInTransactionWithoutResult(TransactionErrorHandler.java:181)
    at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:34)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
    at org.apache.camel.spring.spi.TransactionErrorHandler.doInTransactionTemplate(TransactionErrorHandler.java:174)
    at org.apache.camel.spring.spi.TransactionErrorHandler.processInTransaction(TransactionErrorHandler.java:134)
    at org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:103)
    at org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:112)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:87)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:165)
    at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:439)
    at org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:137)
    at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:211)
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:175)
    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)
    at java.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)
Caused by: com.jcraft.jsch.JSchException: Auth fail
    at com.jcraft.jsch.Session.connect(Session.java:512)
    at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:118)
    ... 48 common frames omitted

当我在最终代码引发异常之前设置断点时,我可以看到要登录的用户名设置为${in.header.senderTargetUserName}。

正如您还可以看到的,camel显示了异常之前的最新交换。该交换的头包含我期望的值。

有什么想法吗?

共有2个答案

巫马欣嘉
2023-03-14

使用动态to而不是普通to,路线将开始工作:

    from(fromWorkInDirectoryEndpoint())
                .transacted()
                .process(new SetCustomFileName())
                .process(new SetSenderTargetUsername())
                .toD(targetProvideFileEndpoint());

从Camel:2.16开始提供https://camel.apache.org/message-endpoint.html.

对于较旧的版本,请使用Souciance建议的接收者列表。

慕容烨
2023-03-14

好的,如果我理解正确的话,你的“从”endpoint实际上是一个动态endpoint,因为注入了标头。

从…起http://camel.apache.org/how-to-use-a-dynamic-uri-in-to.html:

This is not valid code

This snippet is not valid code. Read on.
.to("freemarker://templateHome/${body.templateName}.ftl")

这与您想要的类似,只是您使用的是header和fromendpoint。

文件上说,如果你在2.16以下,你应该使用recipientlist。

.recipientList(simple("sftp://${in.header.senderTargetUserName}@{{target.sftp-core.server}}/{{target.environment.inDirectory}}?disconnect=true&privateKeyUri=/certificate/private.key&fileName=${in.header.customFileName}"))

http://camel.apache.org/recipient-list.html您可以在动态收件人列表中找到示例。

注意,我还没有测试那个endpoint。

 类似资料:
  • 问题内容: Java的标准库似乎使用camelCase作为方法名称。诸如此类的本 机 功能也不例外。 如果是这样,为什么 不驼峰? 有什么特别的吗? 问题答案: 它已经在Java中的1.0版本发布之前-所以我的猜测是,它早于命名约定,它是在API的横扫无缘当命名约定 进行 确定。 (在其他新闻中,应称为。)

  • 问题内容: 我知道静态方法在类级别。因此,我知道我不需要创建实例来调用静态方法。但我也知道我可以将静态方法(如LIKE)称为实例方法。这是我感到困惑的地方,因为我期望从null对象调用静态方法(就像在调用实例方法中一样)。我真的很感谢一些解释,为什么我错了一个期望。 这是示例代码: 问题答案: 通过实例调用静态方法不需要实例存在。只要编译器能够确定变量的类型,它就可以在评估表达式并丢弃结果后静态进

  • 测试代码为: 测试代码为: 你知道怎么了吗?

  • 我遇到JSON解析错误。我的代码如下: 我从我的检查中得到以下错误: 由于:com,无法分析JSON。谷歌。格森。JsonSyntaxException:java。lang.IllegalStateException:应为BEGIN\u对象,但在第1行第2列为BEGIN\u数组 对于我试图读取的JSON,如果成功,我的应该返回5。 我做错了什么?

  • 我正在尝试创建一个组件,使用Camel Spring将文件从一个位置移动到另一个位置。 它在FTP上运行良好,但在尝试使用SFTP时出现了错误。 错误是(SFTP URI:sftp://IP地址:港口/机场?用户名=testftp 错误是(SFTP URI( 依赖项包括: testApplicationContext。xml: 测试等级: 有人能帮我解决这个问题吗。

  • 我编写了一个应用程序来加载骆驼路线。 我有一个Spring-Camel实例。现在我将加载“模块”来订购我的路线,并有能力通过该模块取消/激活一组路线。 因此,我编写了一个XML文件,并将其解组到Java类中。每个模块现在都是一个Java类。我想在这个Java类中定义骆驼路线。 当我从RouteBuilder扩展Java类时,JAXB不会对其进行编组。 你们中的一些人知道我如何定义我的路由,比如"f