如何缓存Apache CXF为特定Java对象生成的编组SOAP XML以提高性能?

bla*_*k3r 5 java xml soap web-services cxf

在我的应用程序中,我们有一个名为getFoo()的webservice方法,它返回一个Foo对象.该的getFoo()方法被调用几百次的速率.Foo对象使用Apache CXF从我们的Java对象编组到SOAP XML响应.

通过分析我们的应用程序,我们确定该对象的编组(java对象 - > soap编码的xml)是CPU周期的最大消费者.由于我们的Foo对象不经常更改,因此每次都不需要重新编组此对象.

我认为这是一个常见的优化,并想知道其他人如何解决它. 我简要地看了一下CXF文档,还有一个我可以使用的Marshall拦截器.我可以创建一个可以将Foo对象映射到XML编码版本的Map.但是,还有一些其他的问题出现了,如果不再需要它们如何从这个地图中删除对象等等.如果内置支持以某种方式检测对象的更改并重新编组,那就太好了.没有什么不可能,但不想重新发明轮子.

编辑(6/16/09):通过制作自定义BareOutInterceptor并修改拦截器链以调用自定义链来取得一些进展.自定义添加了一些额外的逻辑,只调用"writeParts(....)"方法,该方法仅针对给定的java对象执行编组操作.完成后会发布解决方案.另外,我重新命名了这个问题.

Ola*_*ien 3

好吧,这不完全是您正在寻找的答案,但无论如何:REST 用于高流量 Web 服务(例如 Google)的原因是 REST 被设计为可缓存的,而 SOAP 并不是被设计为可缓存的。

SOAP 基本上基于(根据 HTTP 定义)不可缓存的 POST 请求,而 REST 使用 GET - 易于缓存。

在 SOAP (POST) 请求进入实际的 Web 服务之前,您必须检查它 - 即使用代理。“标准”代理通常不知道 SOAP 语法。

IBM 的 WebSphere Application Server 可以做到这一点

问候,奥拉夫