2009-11-24 9 views
12

OK, estoy desarrollando un programa que se implementará en muchas máquinas (Windows, Linux, AIX, z/Linux, openVMS, etc.). Quiero que esa aplicación contenga un servicio web SOAP, pero no quiero agrupar tomcat o ejecutar un servicio separado para los servicios (los quiero en el mismo proceso que el resto de la aplicación).Servidor de servicio SOAP en proceso para Java

Básicamente lo que estoy buscando es algo en lo que puedo definir una clase (digamos WebServices). Estoy bien escribiendo WSDL o cualquier otro tipo de descripción de servicio también. El deseo algo como esto:

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

Obviamente los nombres y parámetros serán diferentes.

He estado buscando en Axis, y parece que proporciona esto, pero no sé qué clases necesito usar. ¿Estoy loco por querer este tipo de comportamiento? No puedo creer que más personas no estén buscando esto, lo hago todo el tiempo con servicios web integrados dentro de clientes .NET.

+0

¿Por qué querrías hacer esto? La * única * buena razón para SOAP es la comunicación entre aplicaciones: ¿por qué querría que su aplicación se comunicara a través de SOAP? – skaffman

+1

Leo esto programáticamente cargando diferentes servicios en el servidor para que los clientes externos puedan llamar. Aún así lo haría en un archivo de configuración, en lugar de hacerlo así. –

+0

Obviamente no está hablando solo. El comando de escucha debe hacer que escuche en un puerto, el servidor aceptará el HTTP, analizará el XML y reenviará la llamada al método correcto con parámetros y otras cosas. La razón por la que deseo esto es porque el servicio web es una pequeña parte de la aplicación, pero necesita interactuar con el resto de la aplicación. Además, no quiero agregar 2 programas en ejecución cuando puedo agregar 1 (especialmente cuando necesitan comunicarse entre ellos). – tster

Respuesta

22

Parece que jdk 6.0 ya viene con una implementación de jax-ws y un pequeño servidor que puede incrustar. havn't I cuenta de todas las piezas, pero esto es un comienzo:

mkdir -p helloservice/endpoint/ 

HelloService/punto final/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/punto final/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); 
    } 
} 

Construir la cosa:

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

Ejecutar la cosa:

java -cp build helloservice.endpoint.Server 

Algo que se ejecuta en http://localhost:9000/SoapContext/SoapPort ahora. Puede obtener el WSDL en http://localhost:9000/SoapContext/SoapPort?WSDL

Havn't tenido tiempo de hacer un cliente todavía ..

+2

Esto es EXACTAMENTE lo que yo quería. Muchas gracias – tster

+0

Como una ventaja adicional, esto viene en el proyecto jax-ws (parte de Glassfish) y solo requiere Java 5. Puede descargar los lanzamientos aquí: https://jax-ws.dev.java.net/ – tster

+0

Parece que ni siquiera necesita eso si está en soles jdk 6 – nos

1

Además de gran respuesta de los números, me encontré con una clase en el eje de Apache llamado SimpleHTTPServer la que estoy bastante seguro hace lo mismo, pero solo requiere Java 1.5 para aquellos que están atascados con 1.5

No voy a explorarlo ya que voy a usar la otra solución, así que no he verificado realmente que haga lo que Creo que sí, pero estoy bastante seguro de que sí.

+0

También hay Jetty (http://www.mortbay.org/jetty/) que se puede ejecutar en modo incrustado. – skaffman

1

La mayoría (¿o todas?) Las implementaciones del servidor Java SOAP proporcionan un Servlet (el enfoque javax.xml.ws.Endpoint en otra respuesta parece un poco más simple ...). Algunas implementaciones de SOAP que podría considerar son: Apache CXF: cxf.apache.org, Apache Axis2: ws.apache.org/axis2/ o Spring Web Servies: static.springsource.org/spring-ws/site/.

El servidor web embebido Java más popular parece ser Jetty, puede configure ya sea programáticamente (utilizando Java simple o Spring beans) o usando un formato XML personalizado.

0

Para abordar la pregunta principal directamente, otro enfoque sería ir con el servidor integrado de Jetty. Ver this link para más detalles. Los enlaces de la página anterior le ayudan a entender tanto el servidor web simple (es decir, uno que sirve páginas estáticas, aunque soy plenamente consciente de "simple" es un término terriblemente vago wrt servidores web) y el servidor web que le ayuda a implementar web servicios.

Cuestiones relacionadas