我不得不问一下骆驼路线行为,这是一种愚蠢(但很容易理解)的逻辑描述。 在主题 - 我需要将信息从一个路由的交换头推送到另一个路由。 这一切都与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(或直接路由,无论在哪里)。 我希望,我对问题的描述非常简单。
答案 0 :(得分:1)
行。 你问了两个问题:
我需要将CIID推送到第一个描述的路线
您必须将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>
如何将$ {header.HostID}放入正文
再次取决于期望的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方法调用,这将会做到这一点。
我是否理解您的问题并且您正在寻找什么?