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に表示されるのは、ルートに対応するスレッドが削除されていないことです。したがって、やがてこれらの放棄されたスレッドは蓄積され続けます。
ルートを動的/プログラム的に適切に停止/削除し、ルートのスレッドを解放して、時間の経過とともに蓄積しないようにする方法はありますか?