在到达消费者之前验证VirtualTopic的消息

时间:2013-04-23 09:13:43

标签: apache-camel fuseesb

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

我想通过路由进行验证,因此需要验证一次,而不是在多个消费者身上进行验证。

Camel可以实现吗?什么是语法?

我目前的做法是这样的:

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的消费者吗?

由于

1 个答案:

答案 0 :(得分: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,那么你应该把它放在路线的顶部,而不是在中间。