Как эффективно передавать XML-документы между Camel-маршрутами через ActiveMQ - PullRequest
0 голосов
/ 04 апреля 2019

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

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

Все хорошо.

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

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

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

Спасибо за внимание.

1 Ответ

1 голос
/ 24 мая 2019

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

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

И есть еще одна загвоздка: формат данных сериализации 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
  ...
...