Apache camel:从交换标头到另一条路由的数据

时间:2016-12-19 07:52:19

标签: spring apache-camel integration

我不得不问一下骆驼路线行为,这是一种愚蠢(但很容易理解)的逻辑描述。 在主题 - 我需要将信息从一个路由的交换头推送到另一个路由。 这一切都与CMDB系统和监控工具zabbix有关。 好吧,在第一个我有一个可以在CMDB中切换CI状态的路由:

<route>
    <description> route catching CI ID in jms queue, check it on exist and switch CI state to incident
    </description>
    <from uri="jms:switchCIStateQueue"/>
    <filter>
        <simple>${body} regex '[\d]+'</simple>
        <to uri="bean:otrsCIApi?method=getCIBodyByID(${body})"/>
        <filter>
            <simple>${body} regex '\{.+?\}'</simple>
            <marshal>
                <json library="Jackson"/>
            </marshal>
            <unmarshal>
                <json library="Jackson" unmarshalTypeName="ts.team.otrs.ci.OtrsCI"/>
            </unmarshal>
            <to uri="bean:otrsCIApi?method=switchOTRSCIState(${body})"/>
        </filter>
    </filter>
</route>

它运行良好,但我必须使用来自另一条路线的此动作,该路线有许多检查,过滤器和选择。 我的问题是我没有CI ID作为正文(但保留在标题中)在主逻辑路径的深度。

<route>
    <description>Route catch triggerid 
     and creates a ticket in OTRS, link it to host
    </description>
    <from uri="direct:zab_trig_2_otrs_tick"/>
    <to uri="bean:zabbixApi?method=getTriggerByID(body)"/>
    <filter>
        <simple>${body} regex '\{.+?\}'</simple>
            <marshal>
                <json library="Jackson"/>
            </marshal> 
            <unmarshal>
                 <json library="Jackson" unmarshalTypeName="ts.team.zabbix.trigger.SingleTrigger"/>
            </unmarshal>
            <setHeader headerName="ZabbixTrigger" id="_setZabbixTrigger">
                <simple>${body}</simple>
            </setHeader>
            <!-- search CI in OTRS -->
            <to uri="bean:otrsCIApi?method=searchCI(${body.getHosts().get(0).getName()})"/>
            <!-- Array of CI ID like [] or ["1"] -->
            <split streaming="true">
                <simple>${body}</simple>
                <!-- place it in header-->
                <setHeader headerName="HostID">
                    <simple>${body}</simple>
                </setHeader>
                <to uri="bean:otrsLinkApi?method=ListLinkedTicketsTitleFiltered(${body},${header.ZabbixTrigger.getDescription()})"/>
                <!-- return JSONArray  with State=open otrs Tickets ID -->
                <choice>
                    <when id="ticketslist_empty">
                        <simple>${body} == ''</simple>
                        <!-- Create ticket, connect it to host in OTRS -->
                        <to uri="bean:otrsTicketApi?method=createNewTicket(${header.ZabbixTrigger.getDescription()},${header.ZabbixTrigger.getPriority()})"/>
                        <!-- return body body with ticket id, create link with  ${header.HostID} -->
                        <to uri="bean:otrsLinkApi?method=LinkAdd(${header.HostID},${body})"/>
                        <!-- Here i need to switch CI state if incident priority is higher than 3(Normal)-->
                        <when>
                            <simple>${header.ZabbixTrigger.getPriority()} > 3</simple>
                            <!-- here i need to send  ${header.HostID} to previous described route (jms:switchCIStateQueue)-->
                        </when>
                    </when>
                </choice>
            </split>
    </filter>
</route>

所以,有这条路线的一部分:

                    <when>
                        <simple>${header.ZabbixTrigger.getPriority()} > 3</simple>
                        <!-- here i need to send  ${header.HostID} to previous described route (jms:switchCIStateQueue)-->
                    </when>

我需要从我的标题发送一些信息到jms:switchCIStateQueue(或直接路由,无论在哪里)。 我希望,我对问题的描述非常简单。

1 个答案:

答案 0 :(得分:1)

行。  你问了两个问题:

  1.   

    我需要将CIID推送到第一个描述的路线

  2. 您必须将jms消息推送到jms:switchCIStateQueue 所以,在你的源路线(第二个“大一号”)中它应该是:

    <to uri="jms:switchCIStateQueue"/>
    

    Exchange标头中的任何内容都将位于JMS邮件头中。 Exchange邮件正文将是JMS邮件正文。      如果您将在源代码路由中使用代码按原样执行此操作,那么将有JMS头HostID和您的第一个路径,该路径使{JMS}消息可以${header.HostID}

    访问它

    然后取决于您otrsCIApi.getCIBodyByID期望的内容以及您的通话看起来像

    一个。 <to uri="bean:otrsCIApi?method=getCIBodyByID(${header.HostID})"/>

    湾但是,如果'getCIBodyByID'的预期参数具有不同的结构/格式,并且具有更多CIID,则必须在将其发送到队列(在“大”路径中)或从队列中获取消息后正确构建它。 / p>

    1.   

      如何将$ {header.HostID}放入正文

    2. 再次取决于期望的JMS消息body

      的结构/格式

      一个。只需将HostID标头值放在正文中:

      <when>
           <simple>${header.ZabbixTrigger.getPriority()} > 3</simple>
             <!-- here i set  ${header.HostID} into body -->
             <body>
               <simple>${header.HostID}</simple>
             </body>
              <!-- here i can set  ${header.HostID} into another header if i'd like to  -->
              <setHeader headerName="CIID">
                              <simple>${header.HostID}</simple>
              </setHeader>
              <!-- finally I send message to queue -->
              <to uri="jms:switchCIStateQueue"/> 
      </when>
      

      湾不仅仅是CIID值 - 根据需要构建它(代替<body>元素可能会有处理器或另一个bean方法调用,这将会做到这一点。

      我是否理解您的问题并且您正在寻找什么?