Apache Camel Route中的事件通知程序


Apache Camel是一个开源的轻量级集成库。在本文中,我将演示事件允许的概念以及如何使用它们。

介绍

Apache Camel应用程序的每个步骤都会触发一个事件,该事件使我们可以在消息在“路由”上传播时读取或编辑数据。提供的访问这些事件的机制是EventNotifierSupport该类。

Apache Camel的路由是由Camel按顺序执行的一系列步骤,使用并处理一条消息。该序列的起始点由方法表示from()。路由可能具有许多处理组件,这些组件可以修改消息或将其发送到端点。

要将消息发送到端点,我们使用方法to(),因此Apache Camel Route的基本结构为:

route1.jpeg

在两点之间,例如a from()-> to()to() -> to(),发生了许多我们无法避免的其他步骤。我们将这些步骤称为“事件”。

事件对我们来说至关重要,因为我们可以与事件进行交互以丰富应用程序的行为。

route2.jpeg

与事件的互动

为了捕获Apache Camel中的事件,我们需要创建一个扩展abstract class的类EventNotifierSupport。在此类中,我们将指定一个方法isEnabled来激活事件捕获。

在下面的示例中,有两种方法:该方法isEnable告诉Apache Camel我们将捕获事件。如果该isEnabled方法返回true,则该notify方法接收事件,然后我们可以与它们进行交互。

@Component

public class CamelEvents extends EventNotifierSupport {



    private Integer eventSequence = 1;



    @Override

    public void notify(EventObject event) throws Exception {



    }   


    @Override

    public boolean isEnabled(EventObject event) {       

        return true;
    }

该notify方法接收一个类型的对象,该对象EventObject 包含当前发生的事件。我们可以通过检查对象的实例来验证启动了哪个事件。

@Override
public void notify(EventObject event) throws Exception {



   if (event instanceof ExchangeCreatedEvent) {    



        ... 

    } 



...

捕获事件后,我们可以与它进行交互以读取或编辑路线上发送的消息中的数据。例如,我们可以实现每个阶段在路线上投放的所有内容的自动日志,也可以应用规则来验证数据或丰富数据。

通过创建通用组件,无需开发重复或通用块代码,我们可以使开发人员的工作更轻松。

我在GitHub上发布了一个事件捕获示例。检查该类com.consulting.fuse.poc.event.CamelEvents.java并注意到该notify方法捕获了大量事件。

另请注意以下路线:

from("file:trigger/?fileName=test-a.txt&noop=false")

.routeId("route-a")     

.to("bean:processorA")          

.log("### :: The step to(\"bean:processorA\") was executed")

该路由读取特定文件夹中名为“ test-a.txt”的文件,并将内容发送到processorA使用该to()方法命名的进程。

在此流程中,依次发生以下事件:

  1. ExchangeCreatedEvent
  2. ExchangeSendingEvent
  3. ExchangeSentEvent
  4. ExchangeCompletedEvent 路由执行时,每个事件都将发送到class中的Event Notify实现CamelEvents。

在此示例中,我们在日志中打印了每个事件以及执行的顺序号。

在日志中按执行顺序打印每个事件

log.png route3.jpeg 交流完成活动

在每种情况下,我们都可以操纵或仅获取要使用的Exchange值。以下块将从文件接收的内容更改为大写值,并添加前缀“ EDITED”:

因此,如果我们在路线中包括其他步骤,则被投放的内容将始终使用大写字母。程序员不必担心,因为该事件会在所有路径上都起作用。

from("file:trigger/?fileName=test-b.txt&noop=false&moveFailed=failed")

    .routeId("route-non-handled-exception")

    .process(new Processor() {


     @Override

      public void process(Exchange exchange) throws Exception {         

         if (null == exchange.getIn().getHeader("fooHeader")) {             

        throw new NonHandledException("Exception throwed to test");                   }         

       }

                })

    .log("NonHandledException occur ")

重要的是,异常也会启动事件。例如,以样本中存在的路由未处理例外路由为例。当我们强制执行异常ExchangeFailedEvent时,无论我们是否处理异常,都会发生一个称为的事件。

from("file:trigger/?fileName=test-b.txt&noop=false&moveFailed=failed")

    .routeId("route-non-handled-exception")

    .process(new Processor() {


     @Override

      public void process(Exchange exchange) throws Exception {         

         if (null == exchange.getIn().getHeader("fooHeader")) {             

        throw new NonHandledException("Exception throwed to test");                   }         

       }

                })

    .log("NonHandledException occur ")

log2.png

结论 活动是我们路线上的强大资源。如我们的示例所示,在执行骆驼路线时会发生一些事件。探索我们的示例应用程序,观察从应用程序的初始化到完成路由所发生的事件。

log3.png

不幸的是,没有关于这些事件的大量文档,但是在这里我们有一个很好的起点。


原文链接:http://codingdict.com/