Java - WeBservices que se ejecutan de manera simultánea

 
Vista:

WeBservices que se ejecutan de manera simultánea

Publicado por Rebecca (2 intervenciones) el 09/06/2014 12:29:09
Buenos días,

Estoy teniendo un problema que no estoy segura de cómo resolver.

He montado un servicio Web con distintos métodos, uno de los cuáles consume otro servicio Web para obtener información de una herramienta. Básicamente mi método obtiene un ID a partir de un nombre y realiza una serie de updates.

El problema es que se ejecutan varias llamadas a mi método y algunas veces al mismo tiempo. Por ejemplo:

- Se ejecutan 2 llamadas a la vez, la primera con el parámetro nombre1 y la segunda con el parámetro nombre2.
- La primera de ellas obtiene el resultado ID1 y lo almacena en una variable, pero antes de que termine de ejecutarse, la segunda de ellas obtiene el resultado ID2, lo que hace que (esto ya no entiendo por qué) el valor de la variable donde almaceno el ID de la primera llamada se modifique.
- Al final el resultado es que en mitad de la ejecución de la primera llamada, la variable cambia del valor ID1 al ID2 y posteriormente se realiza la update sobre el registro equivocado.

Actualmente la variable donde almaceno el ID la tengo declarada a nivel de clase, como un atributo de la misma, ¿serviría si en lugar de esto la creo como un atributo del método?

Muchas gracias por adelantado.

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

WeBservices que se ejecutan de manera simultánea

Publicado por Rebecca (2 intervenciones) el 09/06/2014 18:42:40
Intentaré aportar un poco más de información:

- El servidor donde tengo publicado mi servicio es un Glassfish.
- Mi servicio está desarrollado en JAX-WS, aunque el mismo, a su vez, es un cliente que consume el servicio de otra herramienta usando Axis2 (dadas las necesidades del proyecto, esta era la única posibilidad).

Un ejemplo similar de mi servicio sería algo así:

Código:
class Modificador
{
// Objeto para almacenar la estructura de una persona (objeto personalizado de la herramienta destino)
Persona pers;

...
...
...


public cambiar_edad (string nombre, int edad)
{
string query = "SELECT * FROM personas WHERE nombre = " + nombre;

// El método executeQuery devuelve un objeto de tipo "Persona"
pers = servicio.executeQuery (query);

...
...

// En el momento en que se están haciendo estas operaciones es cuando llega otra llamada al mismo método
// y machaca el valor de la variable pers.

...
...

pers.edad = edad;
servicio.update(pers); //Por tanto, el update se realiza sobre el registro que no debe
}

...
...
}

No sé si se entiende bien... Yo creo que el problema está en el Glassfish que no gestiona bien las conexiones, pero creo que podría solucionarlo directamente en el código mediante la variable pers, quizá debería declararla a nivel de método en lugar de hacerlo a nivel de clase, o quizá ponerle un synchronized al método "cambiar_edad". El problema es que no estoy segura y no puedo hacer cambios a la ligera porque no hay entorno de desarrollo :(

Muchas gracias.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar