Uploaded image for project: 'Tuscany'
  1. Tuscany
  2. TUSCANY-1804

@OneWay repeted invocations doesn't work in web service binding

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • Java-SCA-0.99
    • Java-SCA-1.1
    • None
    • None
    • Eclipse/JDK 1.5 / Ubuntu Linux 7.04

    Description

      i've found the bug that it doens't permit myself to use SCA Binding over
      WebService modifying the distributed-calculator. I found it (on Tuscany
      1.0 rc3) following the chain towards the wire, and i discovered that
      it's an Axis Fault. If you modify in your distributed calculator sample
      the SubtractionService in the following way:
      @Remotable
      public interface SubtractService

      { @OneWay void subtract(double n1, double n2); }

      public class SubtractServiceImpl implements SubtractService {

      public void subtract(double n1, double n2)

      { System.out.println("SubtractService - subtract " + n1 + " and " + n2); //return n1 - n2; }

      }
      I know that it doesn't nothing...but it's a proof of concept.
      And in the calculator node:

      for (int k = 0; k < 10; ++k)
      calculatorService.subtract(2*k+3, k);

      The nodeC with current Axis2OneWayBindingInvoker, even if it's called 10
      times..the receiver gets two messages..
      So in the nodeC terminal you can see only for example:

      [java] SubtractService - subtract 15.0 and 6.0
      [java] SubtractService - subtract 17.0 and 7.0

      The reason is due to the Axis HTTP REUSE:
      If you change in Axis2OneWayBindingInvoker

      requestMC.getOptions().setProperty(HTTPConstants.REUSE_HTTP_CLIENT,
      Boolean.TRUE);

      to:
      requestMC.getOptions().setProperty(HTTPConstants.REUSE_HTTP_CLIENT,
      Boolean.FALSE);

      It works! I suspect that there's a bug or a queue full in Axis because
      it seems that if you send something too fast it doesn't work (I'll see
      it tomorrow, because I don't know how the http client reuse works in Axis).

      The next test, I'll do it :
      for (int k = 0; k < 50; ++k)
      calculatorService.subtract(2*k+3, k);
      It seems to work, but in a strange way.

      During the debugging i discovered your nice structure in order to invoke
      methods over ws.
      Mainly for the Remote SCA over Web Services your structure has the
      following stages (correct me if i'm wrong):

      1) JDKInvocationHandler, where you proxies the method call, create the
      message, set the source, the target and the operation. Here still you do
      some sort of initialization for handling callback.
      2) DataTrasformationInterceptor, where you create the soap body of the
      message given the operation and parameters, for example:
      <ns:add
      xmlns:ns="http://calculator/xsd"><ns:param0>3.0</ns:param0><ns
      aram1>2.0</ns:param1></ns:add>
      3) NonblockingInterceptor, where Tuscany schedules invocation in a
      workpool (here with jdk 1.5 , you could remove dependency from commonj
      package)
      4) At time of scheduling, the next invoker is Axis2SCABindingInvoker,
      which it's a wrapper for Axis2BindingInvoker if the invocation is
      Request-response or for the Axis2BindingInvoker's child
      (Axis2OneWayBindingInvoker) if the invocation is OneWay. In
      Axis2*BindingInvoker you create the soap envelope, the Axis's
      OperationClient, set the axis invocation options and Axis's
      MessageContext and the you send all the stuff on the wire.

      Attachments

        1. patch.diff
          3 kB
          Giorgio Zoppi

        Activity

          People

            simonslaws Simon Laws
            joenx77 Giorgio Zoppi
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: