В моем приложении у нас есть метод webservice, называемый getFoo(), который возвращает объект Foo. Метод getFoo() вызывается несколько сотен раз в секунду. Объект Foo Marshalled от нашего объекта Java до XML-ответа SOAP с использованием Apache CXF.Каким образом можно кэшировать Marshalled SOAP XML, созданный Apache CXF для конкретного объекта Java, чтобы повысить производительность?
Из профилирования нашего приложения мы определили, что сортировка этого объекта (java object -> soap encoded xml) является самым большим потребителем циклов процессора., и поскольку наш объект Foo не меняется очень часто, ремаркетинг этого объекта каждый раз не нужен.
Я понял, что это общая оптимизация и задается вопросом, как другие обратились к ней. Я кратко рассмотрел документы CXF, и есть перехватчик Marshall, который я, вероятно, мог бы использовать. Я мог бы создать карту, которая могла бы сопоставлять объекты Foo с XML-кодированной версией. Но тогда возникает несколько других проблем, например, как вы удаляете объекты с этой Карты, как только они больше не нужны и т. Д. Было бы неплохо, если бы была встроена поддержка для того, чтобы как-то обнаружить изменения объекта и перемаркировать. Ничего невозможного, но не хотел изобретать велосипед.
EDIT (6/16/09): Сделали некоторый прогресс, создав пользовательский BareOutInterceptor и изменив цепочку Interceptor, чтобы вызвать пользовательскую. Пользователь настраивает дополнительную логику только для вызова метода writeParts (....) ", который выполняет сортировку только один раз для данного java-объекта. Поставит решение после завершения. Кроме того, я переименовал этот вопрос.
Есть ли эксперт по Apache CXF по SO, который может рассказать нам, как добавить пользовательский маршаллер в цепочку исходящих перехватчиков? –