1

ディレクトリの内容を反復処理し、その中のファイルを処理してから終了する Spring Integration アプリケーションを使用しています。

ディレクトリを毎秒ポーリングするように以下の XML を設定しましたが、これは私が求めているものとはまったく異なります。これを変更して、ディレクトリ内のすべてのファイルを読み取り、メッセージがシステムを通過し終わったらプログラムを終了させるにはどうすればよいですか?

<?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:int-file="http://www.springframework.org/schema/integration/file"
    xmlns:int="http://www.springframework.org/schema/integration"
    xsi:schemaLocation="http://www.springframework.org/schema/integration/xml http://www.springframework.org/schema/integration/xml/spring-integration-xml-2.1.xsd
        http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.1.xsd
        http://www.springframework.org/schema/integration/file http://www.springframework.org/schema/integration/file/spring-integration-file-2.1.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd >

    <int-file:inbound-channel-adapter
        directory="inputDir" 
        channel="inputChannel">
        <int:poller fixed-rate="1000"></int:poller>
    </int-file:inbound-channel-adapter>

  <!-- more components to read from inputChannel, write to output adapter -->
</beans>
4

2 に答える 2

1

少しハッキーですが、私は過去にこのアプローチを使用し、きれいにうまくいきました。

アプローチは、shutdownキューチャネルを定義することです。メインスレッドから、メッセージがこのチャネルに到達するのを待ち、アプリケーションコンテキストを閉じるために使用可能になったら待機します。

<int:channel id="shutdownChannel"><int:queue/></int:channel>

メインスレッドで-:

    PollableChannel pollableChannel = applicationContext.getBean("shutdownChannel",PollableChannel.class);
    pollableChannel.receive();
    applicationContext.close();

receiveメインコードは、メッセージがシャットダウンチャネルに入ったときにのみコールを通過します。ここで問題となるのは、シャットダウンチャネルにメッセージを送信する方法です。

ファイルメッセージの最終プロセッサでいくつかの状態を維持できます。たとえば、ファイルが最後に処理されてからの時間など、次のことがストローマンである可能性があります。

public class FileContentProcessor {
    private long lastProcessedTime = System.currentTimeMillis();

    public void processContent(String content){
        this.lastProcessedTime = System.currentTimeMillis();
        System.out.println("Processed content: " + content);
    }

    public long msSinceLastProcessed(){
        return System.currentTimeMillis() - this.lastProcessedTime;
    }
}

この状態に基づいてインバウンドチャネルアダプタを定義します。

<int:inbound-channel-adapter ref="fileProcessor" method="msSinceLastProcessed" channel="shutdownFilterChannel">
    <int:poller fixed-rate="3000"/> 
</int:inbound-channel-adapter>

<int:filter input-channel="shutdownFilterChannel" output-channel="shutdownChannel" expression="payload>20000"></int:filter>

ここでは、基本的に最後の処理からの時間を取得し、最後の処理時間から20秒以上経過しているかどうかをチェックし、そのメッセージをシャットダウンチャネルに渡すフィルターを通過させます。

于 2012-11-28T16:05:46.070 に答える
0

スタンドアロンのJavaプログラムを使用していると仮定すると、特定の間隔でメッセージを受信しない場合は、おそらく出力チャネルとSystem.exitにメッセージを送信できます。

 final AbstractApplicationContext context =
                new ClassPathXmlApplicationContext("classpath:META-INF/spring/integration/*-context.xml");

// initiates poller to poll files
// do your processing and then send to a channel say output ..

PollableChannel output = (PollableChannel) context.getBean("output");
Object msg = null;
while((msg = output.receive(1000)) != null)
   {
        msg = output.receive().getPayload();        
        System.out.println("payload - " + msg);
    }
System.exit(0);

もう1つのオプションは、サービスアクティベーターにメッセージを送信してから、jvmシャットダウンを開始することです。

注:EAIパターンは、実際にファイルを処理してから、処理されたディレクトリに移動することです。

于 2012-11-28T14:39:18.633 に答える