tutorial instalar generate from example java web-services wso2 axis2 webservice-client

instalar - ¿Puedo establecer propiedades en el MessageContext antes de invocar el stub en Axis 2 Java?



axis2 tutorial (2)

Estoy usando AXIS 2 para llamar a los métodos de WS usando un stub llamado ChannelConnectServiceStub.

Generando stub y ConfigurationContext:

public class TestWSClient { private void init() throws Exception { String proxyUrl = "http://subdom.dom.com/testpath/TestConnect.asmx"; ConfigurationContext ctx = ConfigurationContextFactory.createConfigurationContextFromFileSystem("/rootFolder/Axis2/axis2-1.4.1/repository", "/rootFolder/Axis2/axis2-1.4.1/conf/axis2.xml"); ChannelConnectServiceStub channelConnectServiceStub = new ChannelConnectServiceStub(ctx,proxyUrl); ctx.setProperty("testid", "testidval"); // Approach 1 channelConnectServiceStub._getServiceClient().getServiceContext().setProperty("testid", "testidval"); // Approach 2 } }

Y estoy usando un LogHandler para registrar las solicitudes y respuestas de mensajes.

LogHandler:

class LogHandler extends AbstractHandler implements Handler { @Override public InvocationResponse invoke(MessageContext messageContext) throws AxisFault { String testID = null; String invokeStr = null; String axisService = null; String action = null; invokeStr = messageContext.getEnvelope().toString(); axisService = messageContext.getAxisService().getName(); action = messageContext.getAxisMessage().getAxisOperation().getInputAction(); testID = (String) messageContext.getProperty("testid");// Approach 1 testID = (String) messageContext.getServiceContext().getProperty("testid");// Approach 2 return InvocationResponse.CONTINUE; } }

Quiero pasar una propiedad ("testid") desde el punto en el que estoy creando y llamando al stub a la clase LogHandler. He mencionado dos enfoques que he tomado.

Ambos están pasando el valor. Pero el problema es que hay múltiples hilos de clientes que usan el mismo TestWSClient para usar el servicio. Entonces, diferentes valores que se establecen por diferentes clientes se intercambian cuando se trata de LogHandler. (Pero invokeStr, AxisService y action no tienen este problema).

  1. ¿Hay alguna forma de pasar propiedades al MessageContext antes de invocar el stub?
  2. ¿Alguien puede ayudar a obtener una propiedad del talón al LogHandler sin intercambiar los valores en un entorno de subprocesos múltiples?

Intenté debajo de uno también pero fallé ya que operationContext es NULL.

OperationContext operationContext = stub._getServiceClient().getLastOperationContext(); logger.info("operationContext : " + operationContext); if (operationContext != null) { MessageContext outMessageContext = operationContext.getMessageContext("Out"); if (outMessageContext != null) { logger.info("outMessageContext.getEnvelope().toString() : " + outMessageContext.getEnvelope().toString()); outMessageContext.setProperty("Portal", getPortal()); } MessageContext inMessageContext = operationContext.getMessageContext("In"); logger.info("inMessageContext : " + inMessageContext); if (inMessageContext != null) { logger.info("inMessageContext.getEnvelope().toString() : " + inMessageContext.getEnvelope().toString()); inMessageContext.setProperty("Portal", getPortal()); } }


Asegúrese de obtener instancia singleton de ConfigurationContext.

cuando establece setProperty y getProperty desde ServiceContext, tenga en cuenta que está obteniendo una copia compartida del objeto Property por jvm, así que en lugar de la clave "testid", use una clave única,

ex: en el código del lado del cliente después de la inicialización del stub en lugar de,

channelConnectServiceStub._getServiceClient().getServiceContext() .setProperty("testid","testidval");

tratar

channelConnectServiceStub._getServiceClient().getServiceContext() .setProperty(stub._getServiceClient().getServiceContext().getName(), "testidval");

y para recuperar la propiedad, en el manejador de registros utilice la misma clave (el msgContext.getServiceContext().getName() es único por flujo)

En lugar de

messageContext.getServiceContext().getProperty("testid");

tratar

messageContext.getServiceContext() .getProperty(msgContext.getServiceContext().getName());

También tenga en cuenta que está almacenando valores en un objeto Propiedad compartido de jvm, para evitar el crecimiento de la memoria, elimine el valor una vez que ya no lo necesite.

messageContext.getServiceContext() .removeProperty(msgContext.getServiceContext().getName();


Para establecer diferentes propiedades para diferentes mensajes, debe configurarlos en Messagecontext. Pero en el contexto del mensaje del cliente, el mensaje será nulo. Establecer la propiedad en Servicecontext es como; esa propiedad está viva hasta que finalice la invocación del servicio.

Lo que puede hacer es, desde el código auxiliar del cliente, agregar un encabezado de soap personalizado y establecer el ID en el encabezado. Lea ese encabezado desde el controlador.

ServiceClient serviceClient = stub._getServiceClient(); serviceClient.addStringHeader("xx")