【问题标题】:In-process SOAP service server for Java用于 Java 的进程内 SOAP 服务服务器
【发布时间】:2009-11-24 20:31:17
【问题描述】:

好的,我正在开发一个程序,它将部署到许多机器(Windows、Linux、AIX、z/Linux、openVMS 等)。我希望该应用程序包含一个 SOAP Web 服务,但我不想捆绑 tomcat 或为这些服务运行单独的服务(我希望它们与应用程序的其余部分在同一进程中)。

基本上我正在寻找的是我可以定义一个类的东西(比如WebServices)。我也可以编写 WSDL 或任何其他类型的服务描述。我想要这样的东西:

SOAPServer server = makeMeASoapServer();
//do config on the server
server.add(new WebService(...));
server.listen(port);

显然名称和参数会有所不同。

我一直在研究 Axis,它似乎提供了这个,但我不知道我需要使用哪些类。我想要这种行为是不是很疯狂?我不敢相信越来越多的人没有在寻找这个,我一直在使用 .NET 客户端中的嵌入式 Web 服务来做这件事。

【问题讨论】:

  • 您为什么要这样做? 唯一使用 SOAP 的好理由是应用程序之间的通信 - 为什么您希望您的应用程序通过 SOAP 与自己通信?
  • 我将其解读为以编程方式在服务器上加载不同的服务以供外部客户端调用。不过,我仍然会在配置文件中这样做,而不是那样。
  • 它显然不是在自言自语。监听命令应该让它监听一个端口,服务器将接受 HTTP,解析出 XML 并将调用转发到带有参数和诸如此类的正确方法。我想要这个的原因是因为 Web 服务是应用程序的一小部分,但它需要与应用程序的其余部分进行交互。此外,当我可以添加 1 个时(尤其是当它们需要相互通信时),我不想添加 2 个正在运行的程序。
  • @Dean,是的,这就是我想要的。重要的部分是服务与程序正在执行的其他操作进行交互,因此我希望它共享一个地址空间。

标签: java web-services soap axis


【解决方案1】:

似乎 jdk 6.0 已经带有一个 jax-ws 实现,以及一个可以嵌入的小服务器。 我还没有弄清楚所有的部分,但这是一个开始:

mkdir -p helloservice/endpoint/

helloservice/endpoint/Hello.java:

package helloservice.endpoint;

import javax.jws.WebService;

@WebService()
public class Hello {
  private String message = new String("Hello, ");

  public void Hello() {}

  public String sayHello(String name) {
    return message + name + ".";
  }
}

helloservice/endpoint/Server.java:

package helloservice.endpoint;
import javax.xml.ws.Endpoint;

public class Server {

    protected Server() throws Exception {
        System.out.println("Starting Server");
        Object implementor = new Hello();
        String address = "http://localhost:9000/SoapContext/SoapPort";
        Endpoint.publish(address, implementor);
    }

    public static void main(String args[]) throws Exception {
        new Server();
        System.out.println("Server ready...");

        Thread.sleep(5 * 60 * 1000);
        System.out.println("Server exiting");
        System.exit(0);
    }
}

构建事物:

mkdir build
javac -d build helloservice/endpoint/*java
$JAVA_HOME/wsgen -d build -s build -classpath .  helloservice.endpoint.Hello

运行这个东西:

java -cp  build helloservice.endpoint.Server

现在在http://localhost:9000/SoapContext/SoapPort 上运行一些东西。 你可以在http://localhost:9000/SoapContext/SoapPort?WSDL获取wsdl

还没开始做客户..

【讨论】:

  • 这正是我想要的。非常感谢
  • 作为额外的奖励,它包含在 jax-ws 项目(Glassfish 的一部分)中,并且只需要 Java 5。您可以在此处下载版本:jax-ws.dev.java.net
  • 如果你在 suns jdk 6 上似乎你甚至不需要它
  • 我觉得wsgen命令应该是:wsgen -d build -s build/ -classpath build/ helloservice.endpoint.Hello
  • 当我转到第一个 URL 时,我只得到以下文本:“Web 服务没有可用的 JAX-WS 上下文信息。”有人得到同样的东西吗?那是应该显示的吗?我不确定...第二个 URL 按预期显示 xml..。
【解决方案2】:

除了 nos 的出色答案之外,我在 Apache 轴中发现了一个名为 SimpleHTTPServer 的类,我很确定它会做同样的事情,但对于那些坚持使用 1.5 的人来说只需要 Java 1.5

我不打算探索它,因为我将使用其他解决方案,所以我还没有真正验证它是否符合我的想法,但我很确定它确实如此。

【讨论】:

【解决方案3】:

大多数(/全部?)Java SOAP 服务器实现提供了一个 Servlet(虽然另一个答案中的 javax.xml.ws.Endpoint 方法看起来确实有点简单......)。您可以考虑的一些 SOAP 实现是:Apache CXF:cxf.apache.org、Apache Axis2:ws.apache.org/axis2/ 或 Spring Web Servies:static.springsource.org/spring-ws/site/。

最流行的嵌入式 Java Web 服务器似乎是 Jetty,您可以通过编程方式(使用纯 Java 或 Spring beans)或使用自定义 XML 格式来 configure 它。

【讨论】:

    【解决方案4】:

    要直接解决主要问题,另一种方法是使用 Jetty 的嵌入式服务器。有关详细信息,请参阅this link。来自上述页面的链接可以帮助您了解简单的 Web 服务器(即,提供静态页面的服务器;尽管我完全意识到“简单”是一个非常模糊的术语 wrt Web 服务器)和帮助您部署 Web 的 Web 服务器服务。

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多