5

在我的应用程序中,我们有一个名为 getFoo() 的 Web 服务方法,它返回一个 Foo 对象。getFoo () 方法每秒被调用数百次。Foo 对象使用 Apache CXF 从我们的 Java 对象编组到 SOAP XML 响应。

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

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

编辑(2009 年 6 月 16 日):通过制作自定义 BareOutInterceptor 并修改拦截器链以调用自定义链,取得了一些进展。自定义添加了一些额外的逻辑,只调用“writeParts(....)”方法,该方法只对给定的 java 对象执行一次编组。完成后将发布解决方案。另外,我重命名了这个问题。

4

3 回答 3

3

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

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

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

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

问候, 奥拉夫

于 2009-06-13T00:35:15.197 回答
0

SOAP 中没有严格要求您需要使用像 CXF 这样的框架来处理服务器或客户端 SOAP 端点。我们刚刚在使用基于 Axis 1.4 的 SOAP 客户端与基于 Axis 1.1 的服务器通信时遇到了客户端线程死锁,并通过放弃 Axis 并以手写代码发出请求来修复它们。我们不得不对 Axis 服务器撒谎,告诉它我们还有一个 Axis 客户端,但并不感到后悔!;-)

同样,您应该能够绕过 CXF 并在您自己的手写 java 代码中生成 SOAP 响应。然后,您可以使用 Map 缓存已编组(未解析、序列化)的 XML 字符串并消除此热点。

强烈同意 Olaf 在 REST 上的观点:如果您充分利用 HTTP,那么所有这些缓存都在您的服务器和客户端之间的所有中间缓存中免费发生。这当然是新服务需要考虑的事情。

更新:CXF 有可定制拦截器链的概念。一种类型的出站拦截器用于 MARSHAL 阶段,因此听起来您可以在此处添加此缓存而不必放弃 CXF。也许 CXF 专家可以为我们验证这一点?

于 2009-06-13T01:55:13.960 回答
0

Foo 对象使用 Apache CXF 从我们的 Java 对象编组到 SOAP XML 响应。
.. CPU 周期的最大消耗者。并且由于我们的 Foo 对象不会经常更改,因此每次都重新编组该对象是不必要的。

客户端应用程序是否需要立即或尽快知道 Foo 中的更改?

为什么不在消费者/客户端缓​​存它?每秒调用同一个 Web 服务方法数百次的设计可能不是最好的。

于 2009-06-13T04:22:34.590 回答