nitwmanish
nitwmanish

Reputation: 11

problem in concurrent web services

Hi All I have developed a web services. I am getting problem when two different user are trying to access web services concurrently. In web services two methods are there

  1. setInputParameter
  2. getUserService

    suppose

              Time               User              Operation
              10:10 am           user1             setInputParameter
              10:15 am           user2             setInputParameter
              10:20 am           user1             getUserService 
    

User1 is getting result according to the input parameter seted by user2 not by ( him own )

I am using axis2 1.4 ,eclipse ant build, My services are goes here

  1. User class
  2. service class
  3. service.xml
  4. build file
  5. testclass

package com.jimmy.pojo;


public class User {
 private String firstName;
 private String lastName;
 private String[] addressCity;

 public String getFirstName() {
  return firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }

 public String[] getAddressCity() {
  return addressCity;
 }

 public void setAddressCity(String[] addressCity) {
  this.addressCity = addressCity;
 }

}
[/code]


[code=java]package com.jimmy.service;

import com.jimmy.pojo.User;

public class UserService {
 private User user;

 public void setInputParameter(User userInput) {
  user = userInput;
 }

 public User getUserService() {
  user.setFirstName(user.getFirstName() + " changed ");
  if (user.getAddressCity() == null) {
   user.setAddressCity(new String[] { "New City Added" });
  } else {
   user.getAddressCity()[0] = "===========";
  }
  return user;
 }

}
[/code]


[code=java]<service name="MyWebServices" scope="application">
 <description>
  My Web Service
    </description>
 <messageReceivers>
  <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
   class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
  <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
   class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
 </messageReceivers>
 <parameter name="ServiceClass">com.jimmy.service.UserService
 </parameter>

</service>[/code]




[code=java]
<project name="MyWebServices" basedir="." default="generate.service">
 <property name="service.name" value="UserService" />
 <property name="dest.dir" value="build" />
 <property name="dest.dir.classes" value="${dest.dir}/${service.name}" />
 <property name="dest.dir.lib" value="${dest.dir}/lib" /> 
 <property name="axis2.home" value="../../" />
 <property name="repository.path" value="${axis2.home}/repository" />
 <path id="build.class.path">
  <fileset dir="${axis2.home}/lib">
   <include name="*.jar" />
  </fileset>
 </path>
 <path id="client.class.path">
  <fileset dir="${axis2.home}/lib">
   <include name="*.jar" />
  </fileset>
  <fileset dir="${dest.dir.lib}">
   <include name="*.jar" />
  </fileset>
 </path>
 <target name="clean">
  <delete dir="${dest.dir}" />
  <delete dir="src" includes="com/jimmy/pojo/stub/**"/>
 </target>
 <target name="prepare">
  <mkdir dir="${dest.dir}" />
  <mkdir dir="${dest.dir}/lib" />
  <mkdir dir="${dest.dir.classes}" />
  <mkdir dir="${dest.dir.classes}/META-INF" />
 </target>
 <target name="generate.service" depends="clean,prepare">
  <copy file="src/META-INF/services.xml" tofile="${dest.dir.classes}/META-INF/services.xml" overwrite="true" />
  <javac srcdir="src" destdir="${dest.dir.classes}" includes="com/jimmy/service/**,com/jimmy/pojo/**">
   <classpath refid="build.class.path" />
  </javac>
  <jar basedir="${dest.dir.classes}" destfile="${dest.dir}/${service.name}.aar" />
  <copy file="${dest.dir}/${service.name}.aar" tofile="${repository.path}/services/${service.name}.aar" overwrite="true" />
 </target>
</project>

[/code]






[code=java]package com.jimmy.test;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

import com.jimmy.pojo.User;

public class MyWebServices {
 @SuppressWarnings("unchecked")
 public static void main(String[] args1) throws AxisFault {
  RPCServiceClient serviceClient = new RPCServiceClient();
  Options options = serviceClient.getOptions();
  EndpointReference targetEPR = new EndpointReference(
    "http://localhost:8080/axis2/services/MyWebServices");
  options.setTo(targetEPR);
  // Setting the Input Parameter
  QName opSetQName = new QName("http://service.jimmy.com",
    "setInputParameter");
  User user = new User();
  String[] cityList = new String[] { "Bangalore", "Mumbai" };
  /*       We need to set this for user 2 as user 2    */
  user.setFirstName("User 1  first name");
  user.setLastName("User 1 Last name");
  user.setAddressCity(cityList);
  Object[] opSetInptArgs = new Object[] { user };
  serviceClient.invokeRobust(opSetQName, opSetInptArgs);

  // Getting the weather
  QName opGetWeather = new QName("http://service.jimmy.com",
    "getUserService");

  Object[] opGetWeatherArgs = new Object[] {};
  Class[] returnTypes = new Class[] { User.class };

  Object[] response = serviceClient.invokeBlocking(opGetWeather,
    opGetWeatherArgs, returnTypes);

  System.out.println("Context :"+serviceClient.getServiceContext());

  User result = (User) response[0];

  if (result == null) {
   System.out.println("User is not initialized!");
   return;
  } else {
   System.out.println("*********printing result********");
   String[] list =result.getAddressCity();
   System.out.println(result.getFirstName());
   System.out.println(result.getLastName());
   for (int indx = 0; indx < list.length ; indx++) {
    String string = result.getAddressCity()[indx];
    System.out.println(string);
   }
  }

 }
}

Upvotes: 1

Views: 1118

Answers (1)

Tahir Akhtar
Tahir Akhtar

Reputation: 11645

It appears to me that you are trying to maintain state between two subsequent calls of the webservice. For this purpose you are maintaining a private field in Service class. But as the service class is not instantiated on each request you are getting state shared between all the users of webservice.

What you need to do is to store the state in some kind of session scope. The webservice clients will then need to pass-back some session token with each request.

One way of doing stateful webservices with Axis 2 is detailed here

Upvotes: 3

Related Questions