Arrêter/Supprimer un Itinéraire de façon dynamique/par programme N'est pas Supprimer le Thread Correspondant

Lors du traitement d'un Échange de reçus de JMS je crée dynamiquement un itinéraire qui récupère un fichier à partir d'un FTP pour les fichiers système et lorsque le traitement est fait j'ai besoin d'enlever cette même route. Le fragment de code suivant montre comment je fais ceci:

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);
            }
        };
}

Je suis à l'Aide d'un fil à arrêter un itinéraire à partir d'un itinéraire, qui est une approche recommandée dans le Chameau de la Documentation - Comment puis-je arrêter un itinéraire à partir d'un itinéraire

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);
        }
    }
}

En conséquence, la route s'arrête. Mais ce que je vois dans le jconsole est que le thread qui correspond à l'itinéraire n'est pas supprimé. Ainsi, dans le temps, ces abandonné fils juste s'accumulent.

Est-il un moyen de bien arrêter/supprimer un itinéraire de façon dynamique/par programme et aussi pour libérer la route du fil, de sorte qu'ils ne doivent pas s'accumuler dans le temps?

OriginalL'auteur Vladimir Tsvetkov | 2012-04-09