【问题标题】:Apache camel: data from exchange header to another routeApache Camel:来自Exchange标头到另一个路线的数据
【发布时间】:2017-05-04 05:40:02
【问题描述】:

我不得不询问骆驼路线的行为,这是愚蠢(但易于理解)的逻辑描述。 在主题中 - 我需要将信息从一条路线的交换标头推送到另一条路线。 都是关于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 (或直接路由,无论到哪里)。 我希望,我对问题的描述非常完整和简单。

【问题讨论】:

  • 很遗憾没有:) 有什么问题吗?是什么阻止您将 ${header.HostID} 放入 ${body} 中,因为“先前描述的路线”期望它?反之亦然,您的 CID 不是来自 ${body},而是来自该路由中的标头?
  • @Vadim,感谢您的评论。我很抱歉在我的描述中如此粗鲁。主要问题是什么 - 我需要将 CIID 推入第一个描述的路线。我不能赶上,我怎么能做到我的大路线。导致需要的 CIID 放在标头 ${header.HostID} 而不是正文中。如何将 ${header.HostID} 放入正文?
  • 我的意思是,我不知道将信息从 ${header.HostID} 放置到 jms:switchCIStateQueue 的正确方法。如果您有一些想法,我将不胜感激:)

标签: spring apache-camel integration


【解决方案1】:

好的。 你问了两个问题:

  1. 我需要将 CIID 推送到第一个描述的路由中

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

<to uri="jms:switchCIStateQueue"/>

Exchange 标头中的任何内容都将在 JMS 消息标头中。 Exchange 消息体将是 JMS 消息体。 如果您将按原样在源路由中执行此操作,则将有 JMS 标头 HostID 并且您的第一个获取该 JMS 消息的路由可以作为 ${header.HostID} 访问它

然后取决于您的 otrsCIApi.getCIBodyByID 期望什么以及您的呼叫可能是什么样子

一个。 &lt;to uri="bean:otrsCIApi?method=getCIBodyByID(${header.HostID})"/&gt;

b.但是,如果“getCIBodyByID”的预期参数具有与 CIID 更多的结构/格式,则必须在将其发送到队列(在“大”路由中)或从队列中获取消息后正确构建它。

  1. 如何将 ${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>

b.不仅仅是 CIID 值 - 根据需要构建它(代替 &lt;body&gt; 元素,可能会有处理器或其他 bean 方法调用来执行此操作。

我是否正确理解了您的问题,是您正在寻找的问题吗?

【讨论】:

  • 瓦迪姆,非常感谢你!我尝试获取您提到的第一种方式-使用简单的 并期望在其他路线中使用 ${header.HostID} ,但它已变为 Null。很奇怪,我想。然后我检查你关于设置 ${header.HostID} 的建议,它也不适用于我:(。所以,我决定使用计算所需的 HostID(等于 CIID)方法调用和标头中的信息,然后将其发送到另一个路由。
  • 另外,我的最后几行看起来像 感谢您的建议,它使我找到了相当粗糙但可行的解决方案。我认为,我的异常与依赖项绑定或在 camel.xml 中描述了 spring 模式。
  • 不客气。这实际上就是为什么我不使用这些技术并且总是通过处理器或纯 Java 中的 bean 方法调用来完成所需的工作。没有关于具体事物的足够明确的文档,并且对于可以使用的内容和位置存在一些限制......此外,使用纯 Java 性能要好得多。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
相关资源
最近更新 更多