Apache camel setHeader和recipientList在Apache Camel中有什么用途?

Apache camel setHeader和recipientList在Apache Camel中有什么用途?,apache-camel,Apache Camel,输入XML格式 from("file:src/data?noop=true").to("jms:incomingOrders"); // content-based router from("jms:incomingOrders") .choice() .when(header("CamelFileName").endsWith(".xml")) .t

输入XML格式

from("file:src/data?noop=true").to("jms:incomingOrders");

            // content-based router
            from("jms:incomingOrders")
            .choice()
                .when(header("CamelFileName").endsWith(".xml"))
                    .to("jms:xmlOrders")  
                .when(header("CamelFileName").regex("^.*(csv|csl)$"))
                    .to("jms:csvOrders")
                .otherwise()
                    .to("jms:badOrders");        

            from("jms:xmlOrders")
            .setHeader("customer", xpath("/order/@customer"))
            .process(new Processor() {
                public void process(Exchange exchange) throws Exception {
                    String recipients = "jms:accounting";
                    //System.out.println("hii1"+recipients);
                    String customer = exchange.getIn().getHeader("customer", String.class);
                    //System.out.println("hii2"+customer);
                    if (customer.equals("honda")) {
                        recipients += ",jms:production";
                        //System.out.println("hii3"+recipients);
                    }
                    exchange.getIn().setHeader("recipients", recipients);
                }
            })
            .recipientList(header("recipients"));

            // test that our route is working
            from("jms:accounting").process(new Processor() {
                public void process(Exchange exchange) throws Exception {
                    System.out.println("Accounting received order: " 
                            + exchange.getIn().getHeader("CamelFileName"));   
                }
            });                
            from("jms:production").process(new Processor() {
                public void process(Exchange exchange) throws Exception {
                    System.out.println("Production received order: " 
                            + exchange.getIn().getHeader("CamelFileName"));   
                }
            });
        }
    });

我是Apache Camel的新手,所以请帮助我在这里指导代码。此代码复制自Camel in Action,并解释了基于相同EIP的收件人列表的使用。所以,在基于xml和csv进行划分之后,它被传递到recipientList,在那个里我正在努力使用

集标题

.收件人列表(标题(“收件人”)


因此,如果有人能向我解释一下流程,我会很有帮助。

如果您需要将您的消息广播给多个收件人

  • 多播
    是用于静态收件人集的模式:

  • recipientList
    是用于动态收件人集的模式。在这种情况下,您需要告诉Camel在哪里找到/如何评估!在运行时此收件人列表。表达这一点的方法有很多种,其中一种是:“请查看包含确切列表的消息头名称‘foo’”。但是,当然,骆驼路线必须准备/填充(在运行时)标题内容 (在您的示例中,在 进程(新处理器(){…}步骤)


如果您需要将您的信息广播给多个收件人

  • 多播
    是用于静态收件人集的模式:

  • recipientList
    是一组动态的收件人使用的模式。在这种情况下,您需要在运行时告诉Camel在何处查找/如何评估!此收件人列表。有很多种表达方式,其中一种是:“请查看包含确切列表的消息头名称‘foo’”。但当然,您的骆驼路线必须准备/填充(在运行时)头内容 (在您的示例中,在 进程(新处理器(){…}步骤)


但是setHeader的具体用途是什么?为什么他要添加带有客户名称的header?在链中进一步使用它?除了“exchange.getIn().setHeader(“recipients”,recipients”);“do?为什么要再次设置header?”@smitshah header
customer
是在Java DSL
中设置的。setHeader(“customer”,xpath(“/订单/@customer”)
并用于处理器
exchange.getIn().getHeader(“customer”,String.class)
…而头
收件人
是在Processor中设置的,并在
收件人列表
中使用。我不明白是什么让你感到困惑。但setHeader的确切用途是什么?他为什么要添加带有客户名称的头?在链中的下一个位置使用它???除了“exchange.getIn().setHeader(“收件人”)之外“怎么做?为什么要再次设置头?@smitshah header
customer
是在Java DSL
中设置的。setHeader(“customer”,xpath(/order/@customer”)
用于处理器
exchange.getIn().getHeader(“customer”,String.class)
…而头
收件人
是在处理器中设置的,并在
收件人列表
中使用。我不明白是什么让您感到困惑。
<?xml version="1.0" encoding="UTF-8"?>
<order name="motor" amount="1000" customer="honda"/>