2016-11-24 2 views
0

Я пытаюсь создать веб-сервис, который при вызове просматривает локальный каталог и отгружает файлы на FTP-сервер.Apache Camel - Передача файла на определенном маршрутном вызове

Я могу создать простой маршрут, который выбирает файл из локального каталога и загрузки на FTP-сервер ниже код:

<route> 
     <from uri="file://D:\\FTPTest?noop=true&amp;delay=2000" /> 
     <to uri="ftp://[email protected]:21/public_html/EnterpriseProject?password=password123#"/> 
     <to uri="bean:myBean?method=test" /> 
    </route> 

Но я хочу эту передачу файла будет называться, когда конкретный маршрут называется через Restlet WebService называется, я попытался с помощью следующего кода, но он не работает:

<route> 
     <from uri="direct:fileTransferRoute" /> 
      <to uri="file://D:\\FTPTest?noop=true&amp;delay=2000" /> 
      <to uri="ftp://[email protected]:21/public_html/EnterpriseProject?password=password123#"/> 
     </route> 

выше маршрут вызывается Restlet из следующего маршрута:

<route> 
<from 
      uri="restlet:http://0.0.0.0:9080/csitec/{serviceName}?restletMethod=post" /> 
     <process ref="serviceRouteProcessor" /> 
     <toD uri="direct:${in.header.nextRoute}" /> 

    </route> 

Вот код моего serviceRouteProcessor:

public void process(Exchange exchange) throws Exception { 
    String body = exchange.getIn().getBody(String.class); 
    String serviceName = exchange.getIn().getHeader(Constants.SERVICE_NAME).toString(); 
    String nextRoute = serviceName+Constants.NEXT_ROUTE_APPENDER; 
    exchange.getOut().setHeader(Constants.NEXT_ROUTE, nextRoute); 
    exchange.getOut().setBody(body); 
} 

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

ответ

2

Вы должны попробовать pollEnrich особенность content-enricher

В примере раздела вы можете найти пример относительно файлов.

Ваш маршрут должен выглядеть примерно так (я работаю только с верблюд Java DSL, так что этот код немного XML псевдо):

<route> 
    <from uri="direct:fileTransferRoute" /> 
     <pollEnrich uri="file://D:\\FTPTest?fileName=data.txt....." /> 
     <to uri="ftp://[email protected]:21/public_html/EnterpriseProject?password=password123#"/> 
    </route> 
+0

Не могли бы вы объяснить немного @soilworker –

+0

Я добавил ваш маршрут в качестве примера к моему ответу. – soilworker

+0

Атрибут 'uri' не разрешается появляться в элементе 'pollEnrich'. Его странная ошибка. Тем не менее, его работы хорошо с: \t \t \t \t файл: // D: \\ FTPTest Noop = истинная & задержка = 2000;? \t \t \t Это то, что я был на самом деле ищет большое спасибо –

1

Отредактировано:

вы должны понять одну вещь, первый, to является производителем не потребитель <to uri="file://D:\\FTPTest?noop=true&amp;delay=2000" />

Что вы можете сделать это,

@Autowired 
private CamelContext context;// if you have more than one camel context use @Qualifier and wire by bean id 


public void process(Exchange exchange) throws Exception { 
    String body = exchange.getIn().getBody(String.class); 
    String serviceName = exchange.getIn().getHeader(Constants.SERVICE_NAME).toString(); 
    context.startRoute(serviceName+Constants.NEXT_ROUTE_APPENDER);// here in nextroute you must give the routeid 
} 

маршрут должен выглядеть

<route id = "<value of serviceName+Constants.NEXT_ROUTE_APPENDER>" autoStartup = "false"> 
       <from uri="file://D:\\FTPTest..." /> 
       <onCompletion onFailureOnly="true"> 
        <choice> 
        <when> 
         <simple>${property.CamelBatchComplete}</simple> 
        <process ref="asyncSelfShutdownProcessor"/> 
        </when> 
        </choice> 
       </onCompletion> 
       <to uri="ftp://[email protected]:21..."/> 
      </route> 

И добавить asyncSelfShutdownProcessor к прыжку Context

@Component 
public class AsyncSelfShutdownProcessor implements AsyncProcessor { 

    @Autowired 
    private CamelContext context 

    public boolean process(Exchange exchange, AsyncCallback callback){ 

      new Thread(() -> context.stopRoute(exchange.getFromRouteId())).start(); 
    } 
} 

################################ ################################################## Old:

OK Я понимаю вашу потребность: у вас есть маршрут, который перемещает файл из файловой системы на ftp-сервер, все, что вам нужно, - это маршрут, который нужно выполнить только при запуске из службы отдыха. Я хотел бы сделать это так,

* Я сделаю маршрут autoStartup = "false" и назначить в качестве id = "fs-to-ftp" на маршрут

<route id = "fs-to-ftp" autoStartup = "false"> 
      <from uri="file://D:\\FTPTest..." /> 
      <onCompletion onFailureOnly="true"> 
       <process ref="asyncSelfShutdownProcessor"/> 
      </onCompletion> 
      <to uri="ftp://[email protected]:21..."/> 
     </route> 

** Добавление процесса асинхронного самостоятельное выключения в onComplete на маршрут «фс-to FTP».Async Processor

asyncSelfShutdownProcessor= AsyncProcessorConverterHelper.convert(exchange -> { 
      new Thread(() -> context.stopRoute("fs-to-ftp")).start(); 
     }); 

*** Добавить контекстный верблюд зависимости к службе покоя и начать маршрут по идентификатору в службе отдыха context.startRoute("fs-to-ftp")

+0

Спасибо за Ваш ответ @Sagar, на самом деле я звоню другие маршруты из restlet с , так, как я могу назвать маршрут с определенным идентификатором? –

+0

Есть ли способ, которым я могу дать это в моем маршруте и выполнить процесс передачи файлов? –

+0

На самом деле, если вы хотите использовать '', тогда вы должны читать и передавать файлы в '' direct: fileTransferRoute ''программно, а верблюд не будет выбирать сам по себе – Sagar

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