1

呼び出されたときにローカルディレクトリを調べて、そこからファイルを取得してftpサーバーにアップロードするWebサービスを作成しようとしています。

ローカル ディレクトリからファイルを選択して ftp サーバーにアップロードする単純なルートを作成できます。コードは次のとおりです。

<route>
        <from uri="file://D:\\FTPTest?noop=true&amp;delay=2000" />
        <to uri="ftp://user@host.in: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://user@host.in: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);
}

私を助けて、このように機能させるために変更を行う必要があることを提案してください。

4

2 に答える 2

1

編集:

最初に 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://user@host.in:21..."/>
            </route>

そして、春のコンテキストに asyncSelfShutdownProcessor を追加します

@Component
public class AsyncSelfShutdownProcessor implements AsyncProcessor {

    @Autowired
    private CamelContext context

     public boolean process(Exchange exchange, AsyncCallback callback){

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

#################################################### ############################ 古い :

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://user@host.in:21..."/>
        </route>

**自己シャットダウン非同期プロセスをonCompleteルート「fs-to-ftp」に追加します。 非同期プロセッサ

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

***キャメル コンテキストの依存関係を REST サービスに追加し、残りのサービスで ID によってルートを開始しますcontext.startRoute("fs-to-ftp")

于 2016-11-24T05:44:47.223 に答える