axis-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dennis Sosnoski <...@sosnoski.com>
Subject Re: Axis2: Difficulty/misunderstanding using axis2 asynchronous calls
Date Mon, 24 Jan 2011 20:36:26 GMT
Hi James,

In order to get true asynchronous operation you need to use
WS-Addressing with a client listener. If nothing has changed in recent
releases this should work:

        ServiceClient client = stub._getServiceClient();
        client.engageModule("addressing");
        client.getOptions().setUseSeparateListener(true);

You need to have the addressing.mar file from the Axis2
repository/modules directory in your client classpath. I don't think you
need to add anything in the server.xml.

Hope that helps,

  - Dennis

Dennis M. Sosnoski
Java SOA and Web Services Consulting <http://www.sosnoski.com/consult.html>
Axis2/CXF/Metro SOA and Web Services Training
<http://www.sosnoski.com/training.html>
Web Services Jump-Start <http://www.sosnoski.com/jumpstart.html>


On 01/22/2011 03:21 AM, James Oisin Flynn wrote:
> On further investigation, it appears to me that the asynchronous
> interface on the client side is in actual fact no different from the
> synchronous interface, other than the nicety of allowing the client to
> get on with doing something else while its request is brewing. I had
> rather assumed that the asynchronous client would somehow politely
> play byte ping pong with the server side to keep the connection from
> timing out whilst the call was executing. Is this the case? If so,
> does this simply imply that in order to allow for an arbitrarily long
> call, it is only a matter of increasing to timeout?
>
> Regards,
> James.
>
> ------------------------------------------------------------------------
> Date: Tue, 18 Jan 2011 15:35:42 +0100
> Subject: Re: Axis2: Difficulty/misunderstanding using axis2
> asynchronous calls
> From: hakon.sagehaug@uni.no
> To: java-user@axis.apache.org
>
> hi
>
> I had to add this line
>  <parameter name="messageReceiver.invokeOnSeparateThread">true</parameter>
>
>
> In my services.xml, have you tried that? 
>
> HÃ¥kon
>   
>
>
> On 17 January 2011 16:57, James Oisin Flynn <den.galna.kon@hotmail.com
> <mailto:den.galna.kon@hotmail.com>> wrote:
>
>
>     I am having difficulties getting an asynchronous axis2 client to
>     work, very possibly due to my misunderstanding of the way axis2 is
>     supposed to work, though I have not been able to find any
>     analogous examples.
>
>     I have a web service created in Eclipse using the bottom up
>     approach. The web service in question works fine synchronously,
>     but really needs to function asynchronously due to unpredictable
>     latencies. The interface and implementations of a part of this web
>     service are the following
>
>     Interface:
>
>     @WebService
>     @SOAPBinding( style = Style.DOCUMENT )
>     public interface DatabaseSource
>     {
>     @WebMethod
>     @WebResult( name = "TableColumns", targetNamespace = "http://rec.ws" )
>     public TableColumn[] reflectTable(
>     @WebParam( name = "SessionId", targetNamespace = "http://rec.ws" )
>     SessionId sessionId,
>     @WebParam( name = "DatabaseConfig", targetNamespace =
>     "http://rec.ws" )
>     String sourceName,
>     @WebParam( name = "Table", targetNamespace = "http://rec.ws" )
>     String tableName ) throws SQLException, ReconciliationException;
>     }
>
>     Implementation:
>
>     public class DatabaseSourceWS implements DatabaseSource
>     {
>     private ReconciliationServices reconciliationServer;
>     public DatabaseSourceWS()
>     {
>     if ( reconciliationServer == null )
>     {
>     reconciliationServer = ReconciliationServiceWS.getService();
>     }
>     }
>
>     public TableColumn[]
>     reflectTable( SessionId sessionId, String sourceName, String
>     tableName )
>     throws SQLException, ReconciliationException
>     {
>     ReconciliationServiceImpl service =
>     reconciliationServer.getSession( sessionId );
>     database.isl.DatabaseSource source =
>     service.getSource( sourceName );
>     Table table = service.getTable( tableName );
>     if ( source != null && table != null )
>     {
>     source.connect();
>     source.reflectTable( table );
>     return table.getColumns();
>     }
>     return null;
>     }
>     }
>
>
>     The client is also built using Eclipse and Axis2 from the WSDL
>     generated when the service is generated.
>     The client, and it's callback handler are the following...
>
>     The callback handler:
>
>     private class SourceCallbackHandler extends
>     DatabaseSourceWSCallbackHandler
>     implements Runnable
>     {
>     private SourceCallbackHandler()
>     {
>     Thread waitThread = new Thread( this );
>     waitThread.start();
>     }
>
>     public void run()
>     {
>     synchronized ( this )
>     {
>     try
>     {
>     this.wait();
>     }
>     catch ( InterruptedException cont )
>     {}
>     }
>     }
>
>     private void continu()
>     {
>     synchronized ( this )
>     {
>     this.notifyAll();
>     }
>     }
>
>     private TableColumn[] columns;
>     public void receiveResultreflectTable( ReflectTableResponse result )
>     {
>     columns = result.get_return();
>     continu();
>     }
>
>     public void receiveErrorreflectTable( java.lang.Exception e )
>     {
>     e.printStackTrace();
>     // throw a new exception and run continu() in finally clause.
>     continu();
>     }
>
>     public TableColumn[] getColumns()
>     { return columns; }
>     }
>
>
>     The client:
>
>     public DatabaseSourceClient()
>     {
>     try
>     {
>     this.databaseSourceStub = new DatabaseSourceWSStub();
>     }
>     catch ( AxisFault af )
>     {
>     af.printStackTrace();
>     }
>     }
>
>     public void setSessionId( SessionId sessionId )
>     {
>     this.sessionId = sessionId;
>     }
>
>     public void setSourceConfig( DatabaseConfig sourceConfig )
>     {
>     this.sourceConfig = sourceConfig;
>     }
>
>     // ....
>     public void reflectTable( Table table ) throws SQLException
>     {
>     ReflectTable reflect = new ReflectTable();
>     reflect.setSessionId( buildSession());
>     reflect.setSourceName( sourceConfig.getSourceName());
>     reflect.setTableName( table.getName());
>     SourceCallbackHandler handler = new SourceCallbackHandler();
>     try
>     {
>     synchronized ( handler )
>     {
>     databaseSourceStub.startreflectTable( reflect, handler );
>     handler.wait();
>     }
>     }
>     catch ( RemoteException re )
>     {
>     re.printStackTrace();
>     }
>     catch ( InterruptedException cont ){}
>     if ( handler.getColumns() != null )
>     {
>     setColumns( table, handler.getColumns());
>     }
>     }
>     }
>
>
>     On execution, with the following code. The client successfully
>     connects to the web service. The web service successfully
>     completes, and directly returns the result of the operation, an
>     array of columns, to the client. However, the reply is somehow not
>     received. The client sits in wait until the socket times out, and
>     then exits through the callback handlers receiveErrorreflectTable(
>     java.lang.Exception e ) method with the following exception:
>
>     org.apache.axis2.AxisFault: Read timed out
>     at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
>     at
>     org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:203)
>     at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:76)
>     at
>     org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:400)
>     at
>     org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:225)
>     at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:435)
>     at
>     org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:402)
>     at
>     org.apache.axis2.description.OutInAxisOperationClient$NonBlockingInvocationWorker.run(OutInAxisOperation.java:442)
>     at
>     java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>     at
>     java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>     at java.lang.Thread.run(Thread.java:619)
>     Caused by: java.net.SocketTimeoutException: Read timed out
>     at java.net.SocketInputStream.socketRead0(Native Method)
>     at java.net.SocketInputStream.read(SocketInputStream.java:129)
>     at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
>     at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
>     at
>     org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)
>     at
>     org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)
>     at
>     org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116)
>     at
>     org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.readLine(MultiThreadedHttpConnectionManager.java:1413)
>     at
>     org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973)
>     at
>     org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735)
>     at
>     org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1098)
>     at
>     org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
>     at
>     org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
>     at
>     org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
>     at
>     org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:346)
>     at
>     org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:542)
>     at
>     org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:199)
>     ...
>
>     Any help or suggestions would be welcome.
>     Cheers.
>
>

Mime
View raw message