Hi all,

I've got some more details: the error happens because the second message
is sent with an empty body. The workaround is to make the thread sleep
for (at least) 600 ms (unfortunately this is too much for my needs). Is
there any reason or is it a bug? If it is not a bug, why it is not
documented anywhere, since the tutorial for dual channel-non blocking
clients [1] does not use any sleep call?


Thanks,
Michele

[1] http://ws.apache.org/axis2/1_0/userguide3.html#EchoNonBlockingDualClient

Michele Mazzucco wrote:
> Hi all,
> 
> I get a very strange error (on the client side) when I try to send
> multiple (equals, in my case: the submitted requests are the same of the
> "echo" sample) requests to my service. The error happens *only* when
> multiple requests are submitted, i.e., if the program sends only 1
> requests no errors happen.
> 
> 
> 
> INFO  StreamRequestMyServiceClient:main - Sending [2] requests
> INFO  StreamRequestMyServiceClient:send - Sent [2] requests
> INFO  StreamRequestMyServiceClient$QospCallback:onComplete - Received
> respose [1/2]
> INFO  StreamRequestMyServiceClient$QospCallback:onComplete -
> <soapenv:Body
> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";><client:echo
> xmlns:client="http://org.ncl.ac.uk/qosp/clients/codestore";
> xmlns:tns="http://ws.apache.org/axis2";><client:Text>QoSP Echo
> String</client:Text></client:echo></soapenv:Body>
> INFO  StreamRequestMyServiceClient$QospCallback:onComplete - 1 are missing
> ERROR StreamRequestMyServiceClient:logException - ERROR!:
> ERROR StreamRequestMyServiceClient:logException -
> org.apache.axis2.AxisFault: unknown
>       at 
> org.apache.axis2.util.CallbackReceiver.receive(CallbackReceiver.java:65)
>       at org.apache.axis2.engine.AxisEngine.receiveFault(AxisEngine.java:599)
>       at
> org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:282)
>       at 
> org.apache.axis2.transport.http.HTTPWorker.service(HTTPWorker.java:238)
>       at
> org.apache.axis2.transport.http.server.DefaultHttpServiceProcessor.doService(DefaultHttpServiceProcessor.java:177)
>       at 
> org.apache.http.protocol.HttpService.handleRequest(HttpService.java:123)
>       at
> org.apache.axis2.transport.http.server.DefaultHttpServiceProcessor.run(DefaultHttpServiceProcessor.java:236)
>       at
> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
>       at
> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
>       at java.lang.Thread.run(Thread.java:595)
> Caused by: java.lang.Exception: org.apache.axis2.AxisFault
>       at
> org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver.invokeBusinessLogic(RawXMLINOnlyMessageReceiver.java:104)
>       at
> org.apache.axis2.receivers.AbstractInMessageReceiver.receive(AbstractInMessageReceiver.java:34)
>       at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:503)
>       at
> org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:284)
>       at 
> org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:144)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
>       at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
>       at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
>       at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
>       at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
>       at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
>       at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
>       at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
>       at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
>       at
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
>       at
> org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:667)
>       at
> org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
>       at
> org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
>       at
> org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
>       at java.lang.Thread.run(Thread.java:595)
> 
>       at org.apache.axis2.AxisFault.<init>(AxisFault.java:159)
>       ... 10 more
> 
> 
> 
> 
> 
> 
> 
> 
> The following chunk of code submits the requests:
> 
> /**
>  * Sends [EMAIL PROTECTED] #requests} requests to the cluster manager.
>  */
> private final void send()  {
>       final OMElement payload = ClientUtils.getEchoOMElement();
> 
>       // Creates and sets the options
>       Options options = new Options();
> 
>       String routerEPR = System.getProperty("qosp.manager.epr");
>       if (routerEPR == null) {
>               throw new RuntimeException("Unable to get the router EPR");
>       }
>       routerEPR = routerEPR.concat("MyService");
>       options.setTo(new EndpointReference(routerEPR));
> 
> 
>       options.setAction("urn:echo");
>       // The boolean flag informs the axis2 engine to use two separate
>       // transport connection to retrieve the response.
>                       
> options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
>               options.setUseSeparateListener(true);
>               
> options.setSoapVersionURI(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
> 
>       ServiceClient sender = null;
>       try {
>               sender = new ServiceClient();
>                               
> sender.engageModule(RoutingConstants.MODULE_ADDRESSING);
>                       sender.setOptions(options);
> 
>               QospCallback callback = new QospCallback();
>               for (int i = 0; i < this.requests.get(); i++) {
>                       sender.sendReceiveNonBlocking(payload, callback);
>               }
> 
>               if (log.isInfoEnabled()) {
>                       log.info("Sent [" + this.requests.get() + "] requests");
>                       }
> 
>               // Wait till the callback receives the response.
>               while (!callback.isComplete()) {
>                       try {
>                               Thread.sleep(1000);
>                       } catch (InterruptedException e) {
>                               //
>                       }
>               }
> 
>               } catch (AxisFault e) {
>                       if (log.isEnabledFor(Level.ERROR)) {
>                               logException(e);
>                       }
>               } finally{
>                       try {
>                               if (sender != null)
>                                       sender.finalizeInvoke();
>                       } catch (AxisFault axisFault) {
>                               //
>                       }
>               }
> 
>       }       //-- send()
> 
> while this is the callback object used to retrieve asynchronous responses:
> 
> 
> 
> /**
>  * Sets the completion status.
>  *
>  * @param complete    The completion status.
>  */
> @Override
> public void setComplete(boolean complete) {
>       super.setComplete((requests.decrementAndGet() == 0));
> }     //-- setComplete()
> 
> 
> /**
>  * Gets the completion status.
>  *
>  * @return    The completion status.
>  */
> @Override
> public boolean isComplete() {
>       return (requests.get() == 0);
> }     //-- isComplete()
> 
> /**
>  * Handles asynchronous results.
>  *
>  * @param result The asynchronous result.
>  */
> @Override
> public void onComplete(AsyncResult result) {
>       this.setComplete(true);
>       if (log.isInfoEnabled()) {
>               log.info("Received respose [" + (++ this.success)
>               + "/" + this.toReceive + "]");
>                               
> log.info(result.getResponseEnvelope().getBody().toString());
>       }
>       if (this.isComplete()) {
>               log.info("All requests are complete");
>       } else {
>               log.info(requests.get() + " are missing");
>       }                       
> }     //-- onComplete()
> 
> /**
>  * Handles asynchronous errors.
>  *
>  * @param e   The exception.
>  */
> @Override
> public void onError(Exception e) {
>       if (log.isEnabledFor(Level.ERROR)) {
>               logException(e);
>       }
> }     //-- onError()
> 
> 
> 
> 
> Any idea?
> 
> Thanks in advance,
> Michele
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to