2016-02-10 3 views
1

Я создаю маршрут верблюда, который читает файл с локального сервера, добавляет некоторые заголовки, а затем записывает содержимое в файл на другом удаленном сервере sftp.Почему мои свойства не разрешены на этом пути верблюда 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%[email protected]: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 

Когда я поставил точку останова на конечный код, прежде чем он бросает исключение, я могу видеть, что имя пользователя для входа on установлен в значение $ {in.header.senderTargetUserName}.

Как вы можете видеть, верблюд показывает свой последний обмен перед исключением. Заголовки этого обмена содержат значение, которое я ожидаю.

Любые идеи?

+0

@SoucianceEqdamRashti, я просто тестировал ответ, который вы добавили, а затем удалили. Этот ответ выглядит многообещающим. – geoffreydv

+0

Да, я забыл какую-то часть ответа, поэтому удалено для редактирования. –

+0

Я добавил ответ снова после незначительного редактирования. –

ответ

1

Хорошо, так что, если я правильно вас понимаю, ваша «конечная точка» на самом деле является динамической конечной точкой из-за впрыска заголовка.

От 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") 

Это похоже на то, что вы хотите, за исключением того, вы используете заголовок и от конечной точки.

В документации указано, что вы должны использовать список получателей, если находитесь на Camel ниже 2.16, например.

.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 Вы найдете примеры здесь при динамическом списке получателей.

Примечание. Я не тестировал эту конечную точку.

+0

Большое спасибо. Я привык использовать определения маршрутов на основе xml, которые, я считаю, позволяют использовать свойства в конечной точке. Я не использую верблюд 2.16, но тем самым я заменил свой «на» (.) На .recipientList (простой (targetProvideFileEndpoint()); – geoffreydv

+0

Прохладный, рад, что это сработало;) –

+0

Также этот ответ подходит только для " конечные точки, динамические «от» конечных точек работают правильно. – geoffreydv

1

Используйте динамику, а не ясно и маршрут начнет работать:

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

Это доступно от Camel: 2,16 https://camel.apache.org/message-endpoint.html.

Для более старых версий используйте recipientList как предложено Souciance.

Смежные вопросы