我正在尝试使用验证器: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的消费者吗?
由于
答案 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,那么你应该把它放在路线的顶部,而不是在中间。