Apache Camel:如何测试Set <customobject>的实例

时间:2015-06-04 15:02:26

标签: java apache-camel

有人知道如何测试路线中不同类型的Collection吗?

// This processor returns a Collection of 2 Sets
// 1. Set<GoodMessage>
// 2. Set<BadMessage>
.process(new MyGoodBadMessageProcessor())
// Split the result List
.split(body()).choice()
    // How do you test for a Set<GoodMessage>??
    .when(body().isInstanceOf(Set<GoodMessage>)
        .to("direct:good")
    .otherwise()
        .to("direct:bad")
.endChoice()

背景 :(如果有人可以看到更好的方法)我有一个处理器,目前的工作方式如下:

@Override
public void process(Exchange exchange) throws Exception {
    Message message = exchange.getIn();
    Set<UnknownMessage> unknownMessages = message.getBody(Set.class);
    Set<GoodMessage> goodMessages = new HashSet<GoodMessage>();

    for(UnknownMessage msg: unknownMessages) {
        // Simplified logic here
        if (msg.isGood()) {
            goodMessages.add(msg.getGoodMessage());
        }
    }

    message.setBody(goodMessages);
}

我想更新一下,现在包括BadMessage报告:

@Override
public void process(Exchange exchange) throws Exception {
    Message message = exchange.getIn();
    Set<UnknownMessage> unknownMessages = message.getBody(Set.class);
    Set<GoodMessage> goodMessages = new HashSet<GoodMessage>();
    Set<BadMessage> badMessages = new HashSet<BadMessage>();

    List result = new ArrayList();

    for(UnknownMessage msg: unknownMessages) {
        // Simplified logic here
        if (msg.isGood()) {
            goodMessages.add(msg.getGoodMessage());
        } else {
            badMessages.add(msg.getBadMessage());
        }
    }

    result.add(goodMessages)
    result.add(badMessages)
    message.setBody(result);
}

2 个答案:

答案 0 :(得分:2)

你无法以这种方式获得集合类型(与骆驼无关)。 您更新process方法的方式不需要为错误消息创建不同的终点。

根据消息类型将其发送到不同端点的一种可能方法是在选择之前添加处理器,以检查消息类型并添加标头。然后,您的选择语句可以基于此标题工作。

答案 1 :(得分:0)

以下谓词可以使用,但是当Set为空时可能会给出不正确的结果:/

Public class IsGoodMessage implements Predicate {
    @Override
    public boolean matches(Exchange exchange) {
        Message message = exchange.getIn();
        Set unknownSet = message.getBody(Set.class);
        for (Object o : unknownSet) {
            if (o instanceof GoodMessage) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }
}

这有助于: How do I find out what type each object is in a ArrayList<Object>?

更新:进一步阅读后,更好的方法是使用标题/属性来帮助区分消息类型。

步骤1:更新处理器以生成标识不同消息类型的映射。

"GOOD_MSGS" -> List<GoodMessage>
"BAD_MSGS" -> List<BadMessage>

步骤2:创建一个拆分器bean,它拆分此Map,然后使用上一步中的Map键创建一个头。   (参见&#34; splitMessage&#34;这里http://camel.apache.org/splitter.html

步骤3:在路线中使用这些标题相应地路由消息