我们正在尝试为非常复杂的Spring Boot,Camel应用程序建立一个非常简单的审核数据库表,该应用程序具有许多路由(大多数内部路由使用seda://)...我们的想法是我们在数据库表中记录每条路由的处理结果。然后,当出现问题时,我们可以登录数据库,查询表并准确查明发生问题的位置。我以为可以只将exchange-id用作唯一的跟踪标识符,但是很快就知道所有seda://路由都进行了新的交换,或者至少这就是我所看到的(骆驼版本2.24.3)。坦白说,我不在乎我们用什么作为唯一标识符...我可以很容易地生成一个UUID,并可以使用exchange.setProperty(“ id-unique”,UUID)。
我确实使用exchange.setProperty(“ id-exchange”,exchange.getExchangeId())设法使某些东西起作用,并使它通过路由保留了唯一标识符...(我确实读过某些定义的路由前缀(例如jms://)将不会保留交换属性)。以为是,第一个处理器将exchangeId(unique-id)放在交换属性上,我的跟踪逻辑在处理器中,可以将其作为Route定义的一部分:
@Override
public void configure() throws Exception {
// EVENTS : Collect statistics from Camel events
this.getContext().getManagementStrategy().addEventNotifier(this.camelEventNotifier);
// INITIAL : ${body} exchange coming from a simple URL endpoint
// POST request with an XML Message...simulates an MQ
// message from Central MQ. The Web/UI service places the
// message onto the camel route using producerTemplate.
from("direct:" + Globals.ROUTEID_LBR_INTAKE_MQ)
.routeId(Globals.ROUTEID_LBR_INTAKE_MQ)
.description("Loss Backup Reports MQ XML inbound messages")
.autoStartup(false)
.process(processor)
.process(getTrackingProcessor())
.to("seda:" + Globals.ROUTEID_LBR_VALIDATION)
.end();
}
此概念证明(POC)使我至少可以像我们想要的那样跟踪事物...请注意具有相同唯一标识符的多行:
ID_ROW ID_EXCHANGE PROCESS_GROUP PROCESS_STEP RESULTS_STEP RESULTS_MESSAGE
1 ID-LIBP45P-322256M-1603188596161-4-6 Loss Backup Reports lbr-intake-mq add lbr-intake-mq
2 ID-LIBP45P-322256M-1603188596161-4-6 Loss Backup Reports lbr-validation add lbr-intake-mq
事实是,这种POC十分僵化,很难记录诸如成功与例外之类的结果。
我的问题是,有人做过这样的事情吗?如果是这样,它是如何实施的?还是Camel中有一种特别的方式来处理我在网上找不到的方式?
我的其他想法是:
@Component
public abstract class ProcessorAbstractTracker implements Processor {
@Override
abstract public void process(Exchange exchange) throws Exception;
public void createTracker ( Exchange exchange ) {
}
public void updateTracker ( Exchange exchange, String theResultsMessage, String theResultsStep ) {
}
}
@Autowired
ProcessorTracker tracker;
tia,adym