gpt4 book ai didi

spring - Camel动态构建处理器bean调用

转载 作者:行者123 更新时间:2023-12-02 05:07:44 25 4
gpt4 key购买 nike

这是我为一个主题设置的 Bean 示例。请记住,有多个 bean...每种消息类型一个 bean

通过为每种消息类型设置一个路由,我已经能够成功接收和处理所有消息类型,但我想简化上下文文件,因此我只需要一个接收所有主题的路由。

这是我的路线设置......

    <route id="Netty7001Route">
<from uri="netty4:tcp://192.168.200.3:7001…"/>
<to uri=”seda:ProcessRoute”/>
</route>

<route id=”ProcessRoute”/>
<from uri=”seda:ProcessRoute”/>
<setHeader headerName="LOGMESSAGE"><simple>A10::Entering endpoint for track message ${in.header.MSGNAME} via netty4</simple></setHeader>
<to uri="log:messageLogger?level=ERROR"/>
<setHeader headerName="LOGMESSAGE"><simple>A11::Leaving endpoint for track message ${in.header.MSGNAME}</simple></setHeader>
<to uri="log:messageLogger?level=ERROR"/>
<setHeader headerName="LOGMESSAGE"><constant>A14::Entering Mediation</constant></setHeader>
<to uri="log:messageLogger?level=ERROR"/>
**<process ref="DDS_C2_NewSystemReferencePointMediationBean"/>**
<setHeader headerName="MSGNAME"><constant>C2_TM_NewSystemReferencePoint</constant></setHeader>
<setHeader headerName="MSGTYPE"><constant>C2_NewSystemReferencePoint</constant></setHeader>
<setHeader headerName="LOGMESSAGE"><constant>A15::Leaving Mediation</constant></setHeader>
<to uri="log:messageLogger?level=ERROR"/>
<setHeader headerName="LOGMESSAGE"><constant>A17::Sending message to DDS domain 4</constant></setHeader>
<to uri="log:messageLogger?level=ERROR"/>
<to uri="dds://4/C2_TM_NewSystemReferencePoint?typeName=C2_NewSystemReferencePoint"/>
</route>

因此,上面的 process ref= 行是我想要动态的,因为在查看 header 中的 MSGNAME 之前我不知道要调用哪个 Bean 处理器。我尝试使用recipientList,但失败了,因为它们不是端点,而是处理器bean,并且我尝试仅使用ref:DDS_C2_{$in.header.MSGNAME}MediationBean,但camel不会启动并提示此处的简单标记。有没有办法在 Camel Spring 配置中做到这一点?

我尝试了一种解决方法,即使用检查 MSGNAME 的标记,然后调用相应的处理器 bean,但我需要为每种消息类型设置条件。这是可行的,但与每个主题都有一个路由相比,效率极低。

我考虑过只编写一个处理器,它会在java代码中调用适当的bean处理器,但我不确定这是否是执行我需要的操作的正确方法,以及它是否比使用标签。

感谢您的帮助。

最佳答案

最好的方法可能是创建一个带有 ProcessorEndpoint 的新组件,如 here 中所述。 .

工作示例(带处理器)

  1. 创建自定义组件:

    package com.mgyongyosi.sample.component;

    // imports

    public class SpecifiedProcessor extends DefaultComponent {

    @Override
    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
    Object registryObj = getCamelContext().getRegistry().lookupByName(remaining);

    if(!(registryObj instanceof Processor))
    throw new IllegalArgumentException("The Processor with the specified name was not found in the Registry.");

    return new ProcessorEndpoint(uri, this, (Processor)registryObj);
    }
  2. 通过创建名为 specified-processor 的文件来注册您的组件(这将是组件的 uri 方案)在 META-INF/services/org/apache/camel/component 中包含以下内容的目录 ( full documentation ):

    class=com.mgyongyosi.sample.component.SpecifiedProcessor
  3. Java DSL 的用法示例:

    from("timer:helloworld?period=5000")
    .setHeader("MSGNAME", constant("NewSystemReferencePoint"))
    .toD("specified-processor://DDS_C2_${in.header.MSGNAME}MediationBean")
    .log("${body}");

在 XML 中:

<toD uri="specified-processor://DDS_C2_${in.header.MSGNAME}MediationBean"/>

如果是 Bean

Java DSL:.toD("bean:DDS_C2_${in.header.MSGNAME}MediationBean")

XML:<toD uri="bean:DDS_C2_${in.header.MSGNAME}MediationBean"/>

关于spring - Camel动态构建处理器bean调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45988380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com