Как эффективно передавать XML-документы между маршрутами Camel через ActiveMQ

#apache-camel #activemq

#apache-camel #activemq

Вопрос:

У меня есть серия маршрутов Camel, которые извлекают, преобразуют, разделяют и объединяют XML-документы. Все это работает нормально.

Эти маршруты связаны разделами и очередями ActiveMQ.

Все хорошо.

Однако в некоторых случаях мне приходится обрабатывать большое количество документов, а поскольку компонент JMS Camel преобразует XML-документы в текст для сообщения, очереди приводят к преобразованию XML в строку и повторному разбору документов более одного раза, что приводит к значительным затратам на обработку.

Я попытался установить для JMS producer jmsMessageType значение Object , но когда потребитель получает сообщение, и я выводю, exchange.getIn().getBody().getClass().getCanonicalName() я получаю java.lang.String .

Какие настройки мне нужно было бы установить для производителя и потребителя, чтобы объекты XML Document передавались непосредственно через раздел / очередь ActiveMQ без преобразования в строку и повторного анализа?

Спасибо, что посмотрели.

Ответ №1:

Xerces поддерживает Java-сериализацию своих DOMS, а Camel поддерживает Java-сериализацию. Это сомнительно, хотя, если это действительно более эффективно, цитирую документацию Xerces:

Некоторые приблизительные измерения показали, что сериализация XML выполняется лучше, чем сериализация объектов Java, и что для документов экземпляра XML требуется меньше места для хранения, чем для DOMS с сериализацией объектов.

И есть еще одна загвоздка: формат данных сериализации Java Camel устарел, и есть риск, что он будет удален в следующей версии Camel. Реализация очень проста, хотя, и в случае, если она устареет, вы могли бы добавить пользовательский формат данных, копирующий текущий Camel SerializationDataFormat.

Однако, если вы хотите попробовать это, производитель может выглядеть следующим образом:

 from(...)
    // you need to hava Xerces DOM object in the exchange body at this point
    .marshal().serialization()
    .to("jms:myqueue");
  

…и потребитель:

 from("jms:myqueue")
  .unmarshal().serialization()
  // you should have your Xerces DOM again
  ...