Остановка/удаление маршрута динамически/программно не удаляет соответствующий поток

Во время обработки обмена, полученного от JMS, я динамически создаю маршрут, который извлекает файл с 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);
            }
        };
}

Я Использую поток для остановки маршрута из route, что является подходом, рекомендованным в документации Camel - Как я могу остановить маршрут из маршрута

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я вижу, что поток, соответствующий маршруту, не удаляется. Таким образом, со временем эти заброшенныетреды просто продолжают накапливаться.

Есть ли способ правильно остановить/удалить маршрут динамически/программно, а также освободить поток маршрута, чтобы они не накапливались со временем?

7
задан Fortyrunner 9 April 2012 в 15:18
поделиться