我正在尝试使用验证器验证发送到 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 的消费者之前拦截消息吗?
谢谢