Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In-process SOAP service server for Java

OK, I am developing a program which will be deployed to lots of machines (Windows, Linux, AIX, z/Linux, openVMS, etc.). I want that application to contain a SOAP web service, but I don't want to bundle tomcat or run a separate service for the services (I want them in the same process as the rest of the application).

Basically what I'm looking for is something where I can define a class (say WebServices). I'm OK with writing WSDL or any other kind of service description as well. The I want something like this:

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

Obviously the names and parameters will be different.

I've been looking at Axis, and it seems like it provides this, but I don't know what classes I need to use. Am I crazy in wanting this kind of behavior? I can't believe more people aren't looking for this, I do this all the time with embedded web services within .NET clients.

like image 928
tster Avatar asked Nov 24 '09 20:11

tster


2 Answers

Seems jdk 6.0 already comes with a jax-ws implementation, and a little server you can embed. I havn't figured out all the pieces but here's a start:

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);
    }
}

Build the thing:

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

Run the thing:

java -cp  build helloservice.endpoint.Server

Somethings running on http://localhost:9000/SoapContext/SoapPort now. You can get the wsdl on http://localhost:9000/SoapContext/SoapPort?WSDL

Havn't gotten around to making a client yet..

like image 146
nos Avatar answered Nov 16 '22 02:11

nos


In addition to nos's great answer, I found a class in Apache axis called SimpleHTTPServer which I'm pretty sure does the same thing but only requires Java 1.5 for those of you stuck with 1.5

I'm not going to explore it since I'm going to use the other solution, so I haven't actually verified it does what I think it does, but I'm pretty sure it does.

like image 27
tster Avatar answered Nov 16 '22 01:11

tster