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 发送一些信息(或直接路由,无论到哪里)。
我希望,我对问题的描述非常全面和简单。
好的。
你问了两个问题:
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.
的消息后
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 方法调用将执行此操作。
我是否正确理解了您的问题,这就是您要找的吗?
我不得不问一下骆驼路线行为,这是愚蠢的(但易于理解)逻辑描述。 在主要主题中 - 我需要将信息从一条路线的交换 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 发送一些信息(或直接路由,无论到哪里)。 我希望,我对问题的描述非常全面和简单。
好的。 你问了两个问题:
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.
的消息后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 方法调用将执行此操作。
我是否正确理解了您的问题,这就是您要找的吗?