axis-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Håkon Sagehaug <hakon.sageh...@uni.no>
Subject Re: Axis2: Difficulty/misunderstanding using axis2 asynchronous calls
Date Tue, 18 Jan 2011 14:35:42 GMT
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>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