Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Recca en 9 Junio 2014, 12:31 pm



Título: Web Service que se ejecuta varias veces al mismo tiempo
Publicado por: Recca en 9 Junio 2014, 12:31 pm
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.


Título: Re: Web Service que se ejecuta varias veces al mismo tiempo
Publicado por: Recca en 9 Junio 2014, 18:43 pm
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.