Apache camel:数据从 exchange header 到另一条路由

Apache camel: data from exchange header to another route

我不得不问一下骆驼路线行为,这是愚蠢的(但易于理解)逻辑描述。 在主要主题中 - 我需要将信息从一条路线的交换 header 推送到另一条路线。 都是关于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 作为 body (但将其保留在 header 中)在主要逻辑路由的深度。

<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>

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

好的。 你问了两个问题:

  1. i need to push CIID into first described route

您必须向 jms:switchCIStateQueue 推送一条 jms 消息 所以,在你的源路由中(第二个 "big one")应该是这样的:

<to uri="jms:switchCIStateQueue"/>

Exchange headers 中的任何内容都将在 JMS 消息 headers 中。 Exchange 消息 body 将是 JMS 消息 body。 如果您将按原样在源路由中使用代码执行此操作,则会有 JMS header HostID 并且您获取该 JMS 消息的第一条路由可以访问它,因为 ${header.HostID}

然后取决于您的 otrsCIApi.getCIBodyByID 期望以及您的电话可能看起来像什么

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

b。但是如果 'getCIBodyByID' 的预期参数有一个不同的 structure/format 并且比 CIID 更重要,那么当您将它发送到 queue (在 "big" 路由中)时,您必须正确构建它或者在您收到来自 queue.

的消息后
  1. How can i place ${header.HostID} into body

再次取决于什么是预期的 JMS 消息 structure/format body

一个。只需将 HostID header 值按原样放在 body 中:

<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>

b。不仅仅是 CIID 值 - 根据需要构建它(代替 <body> 元素可能有处理器或另一个 bean 方法调用将执行此操作。

我是否正确理解了您的问题,这就是您要找的吗?