0

我正在尝试使用验证器验证发送到 FuseESB 中的虚拟主题(基于 Apache ServiceMix,版本 7.1.0)的 Apache Camel(版本 2.10.4)的消息:xsd(消息是 TextMessage 中的 XML),以及何时它验证失败,我想将消息重定向到另一个主题,并停止处理,所以不要将它发送给普通消费者。因为消费者将因无效消息而失败。

我想对路由进行验证,所以验证一次,而不是对多个消费者进行验证。

骆驼可以做到这一点吗?语法是什么?

我目前的做法是这样的:

static final String ACTIVEMQ_TOPIC_PREFIX = "activemq:topic:";
static final String ACTIVEMQ_CONSUMER_PREFIX = "activemq:queue:Consumer.*.";

static final String TOPIC_ORDER_CREATED = "VirtualTopic.order.created";
static final String TOPIC_ORDER_CREATED_ERROR = 
                                          "VirtualTopic.order.created.error";

static final String DIRECT_ORDER_CREATED_ERROR = "direct:orderCreatedError";


from(DIRECT_ORDER_CREATED_ERROR)
    .to(ACTIVEMQ_TOPIC_PREFIX + TOPIC_ORDER_CREATED_ERROR)
    .log("Message sent to " + TOPIC_ORDER_CREATED_ERROR);

// validate order.created topic message 
// before sending to consumer queues.
from(ACTIVEMQ_TOPIC_PREFIX + TOPIC_ORDER_CREATED) 
    .errorHandler(deadLetterChannel(DIRECT_ORDER_CREATED_ERROR))
    .choice() // validation is enabled with property
        .when(simple("${properties:" + PROP_VALIDATION_ENABLED + "} == true"))
            .log("Validating order created body")
            .to("validator:xsd/myxsd.xsd") // validate against xsd
            .onException(ValidationException.class)
                .handled(true) 
                .maximumRedeliveries(0)
                .useOriginalMessage()
                // if invalid send to error topic
                .to(DIRECT_ORDER_CREATED_ERROR)
                .stop()
            .end()
    .end()
    .to(ACTIVEMQ_CONSUMER_PREFIX + TOPIC_ORDER_CREATED)
    .log("Message sent to " + TOPIC_ORDER_CREATED);

我在日志中看到“验证订单创建正文”和“发送到 VirtualTopic.order.created.error 的消息”。在 webconsole 上,我看到一条消息在错误主题中排队,用于一条主主题消息。

问题是 VirtualTopic.order.created 的消费者仍然收到无效消息

您能帮我找到正确的语法来在消息发送给 VirtualTopic 的消费者之前拦截消息吗?

谢谢

4

1 回答 1

0

您可以只使用 deadLetterChannel,让它使用原始消息,然后处理任何错误并将其移至 DLQ。

from(ACTIVEMQ_TOPIC_PREFIX + TOPIC_ORDER_CREATED) 
.errorHandler(deadLetterChannel(DIRECT_ORDER_CREATED_ERROR).useOriginalMessage())
.choice() // validation is enabled with property
    .when(simple("${properties:" + PROP_VALIDATION_ENABLED + "} == true"))
        .log("Validating order created body")
        .to("validator:xsd/myxsd.xsd") // validate against xsd
.end()
.to(ACTIVEMQ_CONSUMER_PREFIX + TOPIC_ORDER_CREATED)
.log("Message sent to " + TOPIC_ORDER_CREATED);

此外,如果您在路线中使用 onException,那么您应该将其放在路线的顶部,而不是中间。

于 2013-04-25T05:01:12.970 回答