Crear servicios orientados a mensaje en Apache SOAP es un poco m�s complejo que crear un simple servicio basado en RPC, pero en muchos casos un modelo orientado a mensaje proporciona una mejor soluci�n a un problema que estamos intentando resolver. En un servicio orientado a mensaje, la implementaci�n del servicio es responsable de procesar los contenidos del SOAP Envelope. Esto quiere decir, que aunque los APIs de Apache SOAP todav�an est�n disponibles para interactuar con el objeto SOAPEnvelope, la implementaci�n del servicio debe invocar aquellas llamadas que son necesarias para extraer cualquier informaci�n de la cabecera y del cuerpo que sean necesarias para procesar la solicitud. Si el servicio orientado a mensaje est� participando en un protocolo solicitud-respuesta que usa mensajes SOAP en �mbas direcciones, entonces tambi�n es responsable de generar el SOAPEnvelope apropiado para la respuesta.
Como los servicios orientados a mensaje tienen control total sobre los SOAP Envelopes, cualquier documento XML podr�a ser pasado como parte del cuerpo del envelope. Cuando los servicios reciben un SOAP Envelope, son libres de extraer el cuerpo, y hacer con �l lo que les plazca.
Al contrario que las implementaciones de servicios RPC, las implementaciones de servicios orientados a mensajes deben ser conformes a un simple interface:
void name(SOAPEnvelope request-envelope, SOAPContext request-context, SOAPContext response-context)
donde name es el nombre del m�todo/funci�n, request-envelope es el SOAPEnvelope que contiene el mensaje entrante, request-context es el SOAPContext que contiene el mensaje entrante, y response-context es el SOAPContext que deber�a usarse para una respuesta si es necesario.
Si el transporte de comunicaciones que est�mos usando soporta interacci�n en los dos sentidos, como HTTP, podemos usar el response-context para enviar una respuesta de vuelta al cliente. Si queremos enviar de vuelta un SOAP Envelope, podemos usar el m�todo marshall(...) de org.apache.soap.Envelope para empaquetar el envelope en un java.io.StringWriter, y luego invocar al m�todo setRootPart(...) de response-context, pasarle el StringWriter como el primer argumento. Si queremos enviar de vuelta cualquier otro tipo de datos, podr�amos necesitar invocar a otros m�todos del response-context.
Al igual que las implementaciones Java de servicios basados en RPC, una implementaci�n de un servicio Java basado en mensaje podr�a lanzar una SOAPException para indicar que ha ocurido alg�n error cuando se proces� la solicitud. Lanzar una SOAPException(FAULT_CODE_CLIENT, ...) permitir� a nuestra implementaci�n de servicio indicar que el fallo fu� debido a un error de cliente, mientras que lanzar una SOAPException(FAULT_CODE_SERVER, ...) indicar� que nuestra implementaci�n de servicio fue el cusante del fallo (Si lanzamos cualquier otro tipo de excepci�n, el servidor la capturar�, y la pasar� a un SOAPException(FAULT_CODE_SERVER, ...)). Ver la especificaci�n SOAP v1.1 para m�s informaci�n sobre fallos SOAP.