7

JMS から受信した Exchange の処理中に、FTP からファイル システムにファイルをフェッチするルートを動的に作成しています。バッチが完了したら、同じルートを削除する必要があります。次のコード フラグメントは、これを行う方法を示しています。

public void execute() {
    try {
        context.addRoutes(createFetchIndexRoute(routeId()));
    } catch (Exception e) {
        throw Throwables.propagate(e);
    }
}

private RouteBuilder createFetchIndexRoute(final String routeId) {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            from("ftp://" + getRemoteQuarterDirectory() +
                "?fileName=" + location.getFileName() +
                "&binary=true" +
                "&localWorkDirectory=" + localWorkDirectory)
                .to("file://" + getLocalQuarterDirectory())
                .process(new Processor() {
                    RouteTerminator terminator;

                    @Override
                    public void process(Exchange exchange) throws Exception {
                        if (camelBatchComplete(exchange)) {
                            terminator = new RouteTerminator(routeId, 
                                    exchange.getContext());
                            terminator.start();
                        }
                    }
                })
                .routeId(routeId);
            }
        };
}

I'm Using a thread to stop a route from a route , これは Camel Documentation で推奨されているアプローチです - How can I stop a route from a route

public class RouteTerminator extends Thread {
    private String routeId;
    private CamelContext camelContext;

    public RouteTerminator(String routeId, CamelContext camelContext) {
        this.routeId = routeId;
        this.camelContext = camelContext;
    }

    @Override
    public void run() {
        try {
            camelContext.stopRoute(routeId);
            camelContext.removeRoute(routeId);
        } catch (Exception e) {
            throw Throwables.propagate(e);
        }
    }
}

その結果、ルートは停止します。しかし、jconsoleに表示されるのは、ルートに対応するスレッドが削除されていないことです。したがって、やがてこれらの放棄されたスレッドは蓄積され続けます。

ルートを動的/プログラム的に適切に停止/削除し、ルートのスレッドを解放して、時間の経過とともに蓄積しないようにする方法はありますか?

4

1 に答える 1

5

これは、次の Camel リリース 2.9.2 および 2.10 で修正されています。このチケットで修正: https://issues.apache.org/jira/browse/CAMEL-5072

于 2012-04-09T13:35:01.083 に答える