-1

以下の構成を使用して、単一のソースから複数のリモート宛先にファイルを送信しています。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring"
        xmlns:util="http://www.springframework.org/schema/util"
        xsi:schemaLocation="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

        <routeContext id="gcgRatesOutbound" xmlns="http://camel.apache.org/schema/spring">
                <route id="gcgRatesFileOut">       
                        <from uri="file:{{nas.root}}/{{gcg.out.prices.dir}}?delay={{poll.delay}}&amp;initialDelay={{initial.delay}}&amp;readLock=rename&amp;scheduledExecutorService=#scheduledExecutorService" />                                       
                        <multicast stopOnException="true">

                                <to uri="scp://{{gcg.ste.Client1_User_Name}}@{{gcg.ste.Host_Name}}:{{gcg.ste.Port_Number}}/{{gcg.ste.Destination_Client1}}?knownHostsFile={{ssh.knownHosts}}&amp;privateKeyFile={{ssh.privateKey}}" />

                                <to uri="scp://{{gcg.ste.Client2_User_Name}}@{{gcg.ste.Host_Name}}:{{gcg.ste.Port_Number}}/{{gcg.ste.Destination_Client2}}?knownHostsFile={{ssh.knownHosts}}&amp;privateKeyFile={{ssh.privateKey}}" />                               

                                <to uri="scp://{{gcg.ste.Client3_User_Name}}@{{gcg.ste.Host_Name}}:{{gcg.ste.Port_Number}}/{{gcg.ste.Destination_Client3}}?knownHostsFile={{ssh.knownHosts}}&amp;privateKeyFile={{ssh.privateKey}}" />                                               
                        </multicast> 
                </route>
        </routeContext>
</beans>

上記の構成を使用して、ファイルはリモート宛先に到達し、すべてのリモート宛先への接続が成功したことが確認されました。

ファイルがすべてのリモート宛先に正常に転送された後、ファイルをアーカイブ フォルダーに移動する必要があります。エラーが発生した場合は、エラー フォルダに移動する必要があります。

ただし、上記の構成でアーカイブ コード (要素) を子要素としてマルチキャスト要素に追加し、 と タグを使用して、エラーが発生した場合にファイルをエラー フォルダーに移動します。ファイルはリモート宛先に到達しません。

<doTry>       
        <multicast stopOnException="true" parallelProcessing="true">

                                <to uri="scp://{{gcg.ste.Client1_User_Name}}@{{gcg.ste.Host_Name}}:{{gcg.ste.Port_Number}}/{{gcg.ste.Destination_Client1}}?knownHostsFile={{ssh.knownHosts}}&amp;privateKeyFile={{ssh.privateKey}}" />

                                <to uri="scp://{{gcg.ste.Client2_User_Name}}@{{gcg.ste.Host_Name}}:{{gcg.ste.Port_Number}}/{{gcg.ste.Destination_Client2}}?knownHostsFile={{ssh.knownHosts}}&amp;privateKeyFile={{ssh.privateKey}}" />                               

                                <to uri="scp://{{gcg.ste.Client3_User_Name}}@{{gcg.ste.Host_Name}}:{{gcg.ste.Port_Number}}/{{gcg.ste.Destination_Client3}}?knownHostsFile={{ssh.knownHosts}}&amp;privateKeyFile={{ssh.privateKey}}" />

                <to uri="file://{{nas.root}}/{{gcg.out.prices.dir}}?fileName={{archive.dir}}" />
        </multicast> 
<doCatch>
        <exception>java.lang.Exception</exception>
                <handled>
                        <constant>true</constant>
                </handled>                                       

                <to uri="file://{{nas.root}}/{{gcg.out.prices.dir}}?fileName={{error.dir}}" />
</doCatch>
</doTry>

ファイルはリモートの宛先に到達せず、ログも生成せず、ファイルはアーカイブ フォルダーに移動されます。

リモート宛先、アーカイブ コード、エラー コードへの移動を別々のルートに配置して、以下のように単一のマルチキャストで参照するようにしました。

            <to uri="direct:Client1FileOut" />

            <to uri="direct:Client2FileOut" />                                                                                                                       

            <to uri="direct:Client3FileOut" />                       

            <to uri="direct:MoveToArchive" />                                       

<route id="gcgFileOut1">       
                        <from uri="direct:Client1FileOut" />                       
                        <doTry>                       

                                <to uri="scp://{{gcg.ste.Client1_User_Name}}@{{gcg.ste.Host_Name}}:{{gcg.ste.Port_Number}}/{{gcg.ste.Destination_Client1}}?knownHostsFile={{ssh.knownHosts}}&amp;privateKeyFile={{ssh.privateKey}}" />
                                <doCatch>
                                                <exception>java.lang.Exception</exception>
                                                <handled>
                                                        <constant>true</constant>
                                                </handled>

                                                <to uri="direct:gcgError" />       

                                </doCatch>
                        </doTry>
                </route>

ただし、ファイルはリモートの宛先に到達せず、ログも作成せず、ファイルはアーカイブ フォルダーに移動されます。

私はキャメルが初めてです。

以下のように shareUnitOfWork 属性を使用してみました

<multicast shareUnitOfWork="true">

ただし、ファイルは Test_2_19082013_3.txt.camelLock ファイルとともにアーカイブ フォルダーに移動されました。

ドロップされたファイルが Test_2_19082013_3.txt だったのに、なぜこのファイルもアーカイブに移動されたのかわかりません

また、ドロップした場所に「ARCHIV~1」という名前のフォルダが作成されます。

4

1 に答える 1

1

ファイルをアーカイブに移動するときに問題が発生した可能性があります。あなたが持っていstopOnException="true" parallelProcessing="true"て、ローカルファイルはおそらく最初に行われます.

おそらくどこかにエラーを出力したいと思うでしょう。ここで、例外をキャッチし、エラーを処理済みとしてマークします。それでも、ログが必要です。ログコンポーネントを使用して、いくつかのログ ステートメントを手動で出力します。場合やエラーだけでなく、成功した場合も同様です。必要に応じてログ出力を手動で有効にできるように、デバッグ レベルでログインできます。

何が起こっているのかを理解するための別のオプションは、トレースを有効にすることです。これにより、「盲目」になりにくくなります。

それはあなた自身でデバッグについて言った -

入力ディレクトリにエラー メッセージをアーカイブして保存しています。表示されるロック ファイルは、Camel が読み取りを行っているときのものです。これが、アプリケーションの誤動作の原因となっている可能性があります。

{{nas.root}}/{{gcg.out.prices.dir}}

fileName=...ファイル名であり、別のサブディレクトリではありません。

だから:file://{{nas.root}}/{{gcg.out.prices.dir}}/{{archive.dir}}それをすべきです(エラーパスについても同様です)。

于 2013-08-20T05:01:25.250 に答える