春季靴-骆驼-一直跟踪交换情况

时间:2020-10-20 12:07:25

标签: spring-boot apache-camel

我们正在尝试为非常复杂的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中有一种特别的方式来处理我在网上找不到的方式?

我的其他想法是:

  • 设置一个老式的Abstract TrackerProcessor类,所有我跟踪的处理器都将其扩展。然后,只需在其中创建,更新等几种方法即可。每个处理器然后仅调用继承的方法来创建和管理审核条目。这样做的好处是可以很容易地与数据库中存储的所有相关数据进行交换。
@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 Bean,每个跟踪的Camel Processor都将其插入其中,并将跟踪逻辑放入Bean中。这似乎是简单而干净的。我在这里唯一关心的/问题是如何确定bean的范围(也许是原型)...由于会有很多路由同时使用bean,因此我们有可能获得混合处理值...
    @Autowired
    ProcessorTracker    tracker;
  • 其他想法?

tia,adym

0 个答案:

没有答案