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

我正在使用线程来停止路线中的路线,这是骆驼文档中推荐的一种方法-如何从路线中停止路线

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 回答