#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
...