在处理从 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中看到的是与路由对应的线程没有被删除。因此,随着时间的推移,这些废弃的线程只会不断积累。
有没有办法以动态/编程方式正确停止/删除路线,并释放路线的线程,这样它们就不会随着时间的推移而累积?