gpt4 book ai didi

java - 并发网络服务中的问题

转载 作者:行者123 更新时间:2023-11-29 06:17:38 29 4
gpt4 key购买 nike

大家好 我开发了一个网络服务。当两个不同的用户试图同时访问 Web 服务时,我遇到了问题。 在网络服务中有两种方法

  1. 设置输入参数
  2. 获取用户服务

    假设

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

User1 正在根据 user2 而不是(他自己)设置的输入参数获取结果

我正在使用 axis2 1.4,eclipse ant build,我的服务在这里

  1. 用户类
  2. 服务等级
  3. 服务.xml
  4. 构建文件
  5. 测试类

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);
}
}

}
}

最佳答案

在我看来,您正试图在 Web 服务的两个后续调用之间保持状态。为此,您在服务类中维护一个私有(private)字段。但是由于服务类没有在每个请求上实例化,因此您将在所有 web 服务用户之间共享状态。

您需要做的是将状态存储在某种 session 范围内。然后,Web 服务客户端将需要在每个请求中传回一些 session token 。

详细介绍了使用 Axis 2 执行有状态 Web 服务的一种方法 here

关于java - 并发网络服务中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4490717/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com