Routing 驼峰:驼峰和多播EIP例外

Routing 驼峰:驼峰和多播EIP例外,routing,apache-camel,multicast,Routing,Apache Camel,Multicast,我有一个简单的例子,我使用3个bean的多播。thirs bean返回一个RuntimeException,但这很好,因为它不会阻止响应返回给客户机(servlet调用)。但是,如果我在from和多播之间添加dynamicRouter,则不会返回更多响应,并且我让Camel通过将消息重新发送到多播来尝试以与以前不同的方式处理异常。这会导致转换异常,因为我在聚合器中修改了消息中的 我怎样才能保持同样的行为并使用dynamicRouter 谢谢 下面是我正在使用的文件的一些摘录: camel.xml

我有一个简单的例子,我使用3个bean的多播。thirs bean返回一个RuntimeException,但这很好,因为它不会阻止响应返回给客户机(servlet调用)。但是,如果我在from和多播之间添加dynamicRouter,则不会返回更多响应,并且我让Camel通过将消息重新发送到多播来尝试以与以前不同的方式处理异常。这会导致转换异常,因为我在聚合器中修改了消息中的

我怎样才能保持同样的行为并使用dynamicRouter

谢谢

下面是我正在使用的文件的一些摘录:

camel.xml

    <!-- Generic route listening to all the the requests -->
    <route id="generic">
        <from uri="servlet:///services?httpBindingRef=rsaHttpBinding"/>
   <!-- <dynamicRouter>
          <method ref="rsaDynamicRouter" method="route"/>
        </dynamicRouter>
    -->
        <choice> 
            <when> 
                <simple>${property.rsaHeader.action} == 'getAccounts'</simple>
                <to uri="direct:getAccounts#1.0" /> 
            </when> 
            <when>
                <simple>${property.rsaHeader.action} == 'createAccount'</simple>
                <to uri="direct:createAccount#1.0" /> 
            </when> 
        </choice>
    </route>

    <!-- Process getAccounts requests -->
    <route>
        <from uri="direct:getAccounts#1.0" />
        <multicast strategyRef="accountAggregator">
            <to uri="bean:accountBackend1?method=getAccounts" />
            <to uri="bean:accountBackend2?method=getAccounts" />
            <to uri="bean:accountBackend3?method=getAccounts" />
        </multicast>
    </route>
好的,找到了

动态路由器必须返回null,否则它将继续重试执行路由! 我只希望有一个路由,而不是多个路由。动态路由器更像一个协调器

无论如何,这是我的动态路由器代码,它可以工作:

public class RsaDynamicRouter {
    public String route(Object body, @Properties Map<String, Object> properties) {
        RsaHeader rsaHeader = (RsaHeader)properties.get("rsaHeader");

        if (properties.get("endDynamicRouting") == null) {
            properties.put("endDynamicRouting", "dummy");
            return "direct://" + rsaHeader.getAction() + "#" + rsaHeader.getVersion();
        } else {
            return null;
        }
    }
}
public类浏览器{
公共字符串路由(对象主体,@Properties映射属性){
RsaHeader RsaHeader=(RsaHeader)properties.get(“RsaHeader”);
if(properties.get(“endDynamicRouting”)==null){
属性。put(“enddynamiccrouting”、“dummy”);
返回“direct://”+rsaHeader.getAction()+“#”+rsaHeader.getVersion();
}否则{
返回null;
}
}
}
Caused by: org.apache.camel.InvalidPayloadException: No body available of type: lu.bgl.example.mycamel.account.SearchCriteria but has value: [Account: number= 1314-1516-1718-1920, name=Larry Page, balance=30, Account: number= 2122-2324-2526-2728, name=Steve Jobs, balance=40] of type: java.util.ArrayList on: Message: [Account: number= 1314-1516-1718-1920, name=Larry Page, balance=30, Account: number= 2122-2324-2526-2728, name=Steve Jobs, balance=40]. Caused by: No type converter available to convert from type: java.util.ArrayList to the required type: lu.bgl.example.mycamel.account.SearchCriteria with value [Account: number= 1314-1516-1718-1920, name=Larry Page, balance=30, Account: number= 2122-2324-2526-2728, name=Steve Jobs, balance=40]. Exchange[Message: [Account: number= 1314-1516-1718-1920, name=Larry Page, balance=30, Account: number= 2122-2324-2526-2728, name=Steve Jobs, balance=40]]. Caused by: [org.apache.camel.NoTypeConversionAvailableException - No type converter available to convert from type: java.util.ArrayList to the required type: lu.bgl.example.mycamel.account.SearchCriteria with value [Account: number= 1314-1516-1718-1920, name=Larry Page, balance=30, Account: number= 2122-2324-2526-2728, name=Steve Jobs, balance=40]]
    at org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:101) ~[camel-core-2.11.0.jar:2.11.0]
    at org.apache.camel.builder.ExpressionBuilder$38.evaluate(ExpressionBuilder.java:934) ~[camel-core-2.11.0.jar:2.11.0]
    ... 131 common frames omitted
Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: java.util.ArrayList to the required type: lu.bgl.example.mycamel.account.SearchCriteria with value [Account: number= 1314-1516-1718-1920, name=Larry Page, balance=30, Account: number= 2122-2324-2526-2728, name=Steve Jobs, balance=40]
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:181) ~[camel-core-2.11.0.jar:2.11.0]
    at org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:99) ~[camel-core-2.11.0.jar:2.11.0]
    ... 132 common frames omitted
public class RsaDynamicRouter {
    public String route(Object body, @Properties Map<String, Object> properties) {
        RsaHeader rsaHeader = (RsaHeader)properties.get("rsaHeader");

        if (properties.get("endDynamicRouting") == null) {
            properties.put("endDynamicRouting", "dummy");
            return "direct://" + rsaHeader.getAction() + "#" + rsaHeader.getVersion();
        } else {
            return null;
        }
    }
}