【问题标题】:Limitations of exposing Java web services using javax.xml.ws.Endpoint?使用 javax.xml.ws.Endpoint 公开 Java Web 服务的限制?
【发布时间】:2009-11-10 20:22:48
【问题描述】:

我正在尝试公开一些 Java Web 服务,以便可以与 C# 进行互操作(参见 SO question)。下面的概念证明代码非常适合 WCF!

我的问题是关于使用javax.xml.ws.Endpoint 类来发布我的服务:

  1. 走这条路线而不是成熟的应用程序服务器会失去什么?
  2. 对于长时间运行且调用量较少的服务来说,这是一个合适的解决方案吗?

以下生成 WSDL,可以从 .Net 干净地调用,并且性能良好。 我为什么不用它?

@javax.jws.WebService
public class TestSvc { 
    @javax.jws.WebMethod()
    public String sayHello() {
        return "Hello!";
    }
}

import javax.xml.ws.Endpoint;
public class Main  {
    public static void main(String[] args) throws Exception {
        Endpoint.publish("http://localhost:8181/Test", new TestSvc());
    }
}

【问题讨论】:

    标签: java .net web-services jax-ws


    【解决方案1】:

    通常可扩展性参数(线程池等)非常有说服力,但您已经忽略了这些。

    接下来,可靠性。一些应用服务器具有很好的集群功能,很容易添加新实例,因此在启用整合管理视图的同时启用容错。

    随着服务数量的增加,易于管理通常会非常方便。

    安全基础设施和声明式安全模型可能非常重要。

    对我来说,当您的业务逻辑变得不平凡时,整个 Java EE 编程模型都值得拥有。现在我们可以进入整个 EJB v Spring v ... 辩论。但我想说的一般观点是,随着您的业务逻辑变得更加严肃,您需要诸如线程管理、持久性、连接池、消息传递、缓存和调度之类的设施;你在应用服务器中找到的东西。其中一些在 EJB3+JPA 或 Spring 中自然而然地出现,一些作为应用服务器中的自然附加组件。如果您有进行严肃的企业级 Java 开发的前景,最好现在购买稍微复杂一点的东西,以便为未来建立可扩展的基础。

    【讨论】:

    • 我可以权衡应用服务器的一些功能,只要我们不会在内置的东西上遇到任何问题。 JEE 编程模型是什么意思? (我是 C# 人——这是 Enterprise Java Beans 吗?)
    【解决方案2】:

    除了失去应用服务器的一般优势外,如果您使用应用服务器,您可能会失去管理、管理和测试服务的能力。

    在互操作方面,如果没有 java 调用,您将无法提取 WSDL。如果您的新服务在发布时执行了某些操作,您可能必须围绕它进行设计。如果您打算使用 WCF 或类似的东西来使用 WSDL,那么在生成服务客户端时,您必须解决 VS 端的一些怪癖(这些怪癖不会每代都发生,但它们确实会不时发生时间。)

    长期运行的服务(我假设换句话说,您的意思是预期无限期运行的服务)只需作为一个进程进行管理。根据您的设计和要求,您必须考虑启动和停止进程、暂停进程等。

    【讨论】:

    • 您能否详细说明一下这些 WSDL 怪癖?间歇性?听起来很吓人。 :)
    • 其中两个要突出显示: 1. 从 WSDL 重新生成客户端时,Visual Studio 似乎经常挂起。最终结果令人沮丧且耗时,因为它需要您终止该过程,稍微拆解您的解决方案,然后将其重新组合在一起。它只需要大约 10 分钟(左右),但它经常发生,以至于你每次必须重新生成时都会感到畏缩。问题肯定出在某处的一行代码中,但谷歌搜索会告诉你很多人都有相同的代码行。 2.客户端会生成一个单独的类型...用光了空间
    • 问题 #2:客户端将使用它自己的来自 WSDL 的对象的个人副本生成。如果您有两个服务,每个服务在 Java 端都返回相同的对象,那么 C# 端将有两个单独的对象打包在不同的包中。因此,您将在 C# 端进行一些设计,以合理化如何在两个不同的包中使用相同的对象。
    • 谢谢——只要我们公开 Web 服务的方式没有任何问题,我可以接受。我从未见过 VS 2008 挂在 WSDL 上,但会留意它。我们处理 #2 的方式是使用 IDE(或 svcutil.exe)生成客户端类,然后手动将它们集成到我们的项目中。一旦网络服务接口变得稳定,这真的不是很多工作。
    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多