Apache camel Apache Camel挂起/锁定-线程安全问题?
我“继承”了一个非常老的项目,Apache2.2.0,显然从未“正常工作” 这个过程似乎偶尔会“锁定”,而且永远不会完成。如果进程被终止,文件将移回入站,并重新启动,它似乎可以工作。所以这是一个奇怪的间歇性问题 我相信这个问题可能是由于自定义路由策略的实现Apache camel Apache Camel挂起/锁定-线程安全问题?,apache-camel,Apache Camel,我“继承”了一个非常老的项目,Apache2.2.0,显然从未“正常工作” 这个过程似乎偶尔会“锁定”,而且永远不会完成。如果进程被终止,文件将移回入站,并重新启动,它似乎可以工作。所以这是一个奇怪的间歇性问题 我相信这个问题可能是由于自定义路由策略的实现 package com.company.integration.management; 导入org.apache.camel.CamelContext; 导入org.apache.camel.Endpoint; 导入org.apache.c
package com.company.integration.management;
导入org.apache.camel.CamelContext;
导入org.apache.camel.Endpoint;
导入org.apache.camel.Exchange;
导入org.apache.camel.Route;
导入org.apache.camel.SuspendableService;
导入org.apache.camel.component.seda.SedaEndpoint;
导入org.apache.camel.impl.throttlingFlightRoutePolicy;
导入org.apache.log4j.Logger;
公共类ParserInflightRoutePolicy扩展了ThrottlingFlightRoutePolicy{
私有静态路由文件路由;
专用静态最终整数最大文件数飞行中=3;
私有静态最终整数MSG_HIGH_WATERMARK=100;
私有静态最终整数MSG_LOW_WATERMARK=25;
私有记录器=Logger.getLogger(getClass());
@凌驾
public void OneExchange开始(路由、Exchange){
int sedaMessagesInflight=0;
sedaMessagesInflight=sedaQueueSize(路线);
if(route.getId().equalsIgnoreCase(“initialRoute”)){
fileRoute=路由;
试一试{
如果((1)个尺寸(路线)seda://parser“”>=MAX_FILES|||(sedaMessagesInflight>=MSG_HIGH_WATERMARK)){
if(!((SuspendableService)fileRoute.getConsumer()).isSuspended()){
logger.error(“流控制:停止文件组件”);
((SuspendableService)fileRoute.getConsumer()).suspend();
}
}
}
捕获(例外情况除外){
记录器错误(“错误停止路线”,ex);
}
}
if(route.getId().equalsIgnoreCase(“PricinGrout”)| | route.getId().equalsIgnoreCase(“persistenceRoute”)){
试一试{
如果((1)个尺寸(路线)seda://parser“”==0)和&(sedaMessagesInflight 0){
sedaMessagesInflight+=seda.getQueue().size();
}
}
}
logger.debug(“飞行中的SEDA消息[“+sedaMessagesInflight+”]”);
返航;
}
整数大小(路由、字符串端点URI){
CamelContext CamelContext=route.getRouteContext().getCamelContext();
Endpoint=camelContext.getEndpoint(endPointUri);
if(端点的端点实例){
return((SedaEndpoint)endpoint.getQueue().size();
}
返回0;
}
@凌驾
public void onExchangeDone(路由、交换){
;
}
}
还有,这可能是由于ThottingInflightRoutePolicy.onExchangeDone()的原因吗方法?该类不实现onExchangeDone,只实现onExchangeBegin。当它挂起时,您是否可以强制执行线程转储,这可能会让您知道它被卡住的位置?是的,下次发生时我们肯定会这样做。不幸的是,这可能需要一周或6个月。我想尝试快速修复该问题,而不必证明线程转储。我是希望像@clausibsen这样的人以前见过这样的代码。