【问题标题】:web service client reference, in a servletWeb 服务客户端参考,在 servlet 中
【发布时间】:2009-11-20 14:01:47
【问题描述】:

我有一个 servlet,该 servlet 使用 .net Web 服务来执行某些功能。为此,我使用“jax-rpc”风格的客户端在 Netbeans 中创建了 Web 服务客户端。

假设我的服务名称是“Tester”。然后生成的两个类分别称为“Tester”和“TesterSoap”。

要获得对 Web 服务的引用,我需要这样做:

Tester t = new Tester_Impl();
TesterSoap tsoap = t.getTesterSoap();

要使用网络服务,我可以这样做:

tsoap.runTest();

我的问题是,由于这是一个执行多次的 servlet,我应该将前两行存储在静态变量中(因此它们只会执行一次),还是将它们存储在本地,以便它们每次执行 servlet 时执行执行?

问同样问题的另一种方式:每次调用前两行时都会影响性能吗? (我在本地测试所有内容,因此很难衡量)。

谢谢...

【问题讨论】:

  • 您应该考虑使用比 JAX-RPC 更现代的东西,JAX-RPC 现在是一个已失效的 API,被 JAX-WS 取代。

标签: java web-services servlets


【解决方案1】:

如果Tester_Impl() 类和方法getTesterSoap() 的默认构造函数和任何初始化块没有做任何昂贵的事情(例如从磁盘读取文件、从数据库加载数据、连接套接字等,我但是假设它没有)那么你就不必担心它。

您可以考虑将它们声明为从HttpServlet 扩展的类的实例变量。但是,一个很大的但是,它将在所有 HTTP 请求之间共享,因为在整个应用程序的生命周期中将只有一个特定 servlet 类的实例。所以如果Tester_Impl 类应该有一个状态,那么将它声明为实例变量是一个非常糟糕的主意。然后它将在所有请求之间共享。换句话说,它不是线程安全的。如果您想确保 servlet 中的线程安全,请在同一个方法块中声明所有内容。

【讨论】:

  • 是的,我明白这一切,但我的问题就是您自己提到的问题:JAX-RPC 生成的代码到底在做什么,我是否需要担心这段代码的并发性?
【解决方案2】:

我不会在这里过早优化。在尽可能靠近生产环境的地方进行测试(即不在本地机器上)并查看性能影响。我过去所做的是编写一个小的 shell 脚本,它使用 wget n 次以 k 毫秒的延迟访问我的服务器,然后测量延迟,可能用一些时间或分析我自己(或使用 jvisualvm 或一些其他分析工具)。

如果您想在不进行测试的情况下保护您的设计免受可能的性能影响,您可以使用工厂来提供服务客户端的实例,然后您可以随时将单例服务客户端换成其中的许多实例.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2010-11-09
    • 2010-09-17
    • 2020-10-23
    相关资源
    最近更新 更多