Foros del Web » Programación para mayores de 30 ;) » Java »

Web Service que se ejecuta varias veces al mismo tiempo

Estas en el tema de Web Service que se ejecuta varias veces al mismo tiempo en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 09/06/2014, 04:27
 
Fecha de Ingreso: octubre-2008
Mensajes: 9
Antigüedad: 15 años, 6 meses
Puntos: 0
Web Service que se ejecuta varias veces al mismo tiempo

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.
  #2 (permalink)  
Antiguo 09/06/2014, 05:23
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Web Service que se ejecuta varias veces al mismo tiempo

Tiene toda la pinta de que la variable "ID" del webservice esté definida como static. Es así?
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 09/06/2014, 06:32
 
Fecha de Ingreso: octubre-2008
Mensajes: 9
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Web Service que se ejecuta varias veces al mismo tiempo

No, eso es lo raro :(

A no ser que Java la defina así por defecto cuando no se especifica nada
  #4 (permalink)  
Antiguo 09/06/2014, 07:27
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Web Service que se ejecuta varias veces al mismo tiempo

Usas java? Si quieres lo muevo al foro de Java que lo verán más programadores de este lenguaje y te podrán ayudar mejor.
__________________
Aviso: No se resuelven dudas por MP!
  #5 (permalink)  
Antiguo 09/06/2014, 07:30
 
Fecha de Ingreso: octubre-2008
Mensajes: 9
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Web Service que se ejecuta varias veces al mismo tiempo

Sí, por favor. Disculpad mi ignorancia, soy nueva :S

Muchas gracias! :)
  #6 (permalink)  
Antiguo 09/06/2014, 09:17
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Web Service que se ejecuta varias veces al mismo tiempo

Es difícil saber con tan poca información, ni siquiera has dicho qué tipo de servicio es ni qué usas para crearlo.

Tampoco hace falta que pongas todo el código, pero sí las partes importantes. Se me ocurre que el problema no está en en el servicio que recibe, si no en el cliente que usas para hacer las peticiones a los otros sericios.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #7 (permalink)  
Antiguo 09/06/2014, 10:29
 
Fecha de Ingreso: octubre-2008
Mensajes: 9
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Web Service que se ejecuta varias veces al mismo tiempo

Es cierto, intentaré aportar algo 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.
  #8 (permalink)  
Antiguo 09/06/2014, 11:32
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Web Service que se ejecuta varias veces al mismo tiempo

Hola:

Glassfish entiendo que gestiona bien las conexiones. Si has puesto un web service, lo normal es que sea una clase que esté en un servlet espceífico de jax-ws y no se haga mas que una sola instancia de esa clase en todo glassfish. Cualquier atributo de la clase sea o no static (en tu ejemplo Persona pers) es compartido para todas las llamadas, por lo que si tienes varias peticiones simultaneas (una petición sin que haya acabado la anterior), pueden "machacar" ese atributo.

Intenta hacerlo usando solo variables locales de los métodos (en el ejemplo que pones es inmediato) y si no es posible, guarda esos valores bien en la sesión web, o bien déjalo como atributo de clase pero usa "synchronized" desde el primer método donde recibes la llamada, aunque no es buena idea porque un cliente tendrá que esperar a que termine el anterior.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #9 (permalink)  
Antiguo 10/06/2014, 00:38
 
Fecha de Ingreso: octubre-2008
Mensajes: 9
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Web Service que se ejecuta varias veces al mismo tiempo

Muchas gracias!

Probaré entonces declarando la variable como local en los métodos que la utilice.

De todas formas, me resulta raro que Glassfish gestione así las llamadas. Por sentido común (tal como yo lo entiendo) cada llamada debería ser independiente de las demás, con sus propias variables y su espacio reservado para las mismas.

En fin, se ve que todavía me queda mucho por aprender :P

Muchas gracias de nuevo!
  #10 (permalink)  
Antiguo 10/06/2014, 01:00
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Web Service que se ejecuta varias veces al mismo tiempo

No es cosa de Glassfish, es cosa de cualquier servidor web. Cuando pones una aplicación (un .war o un .ear), sólo se instancian una vez las clases de la aplicación, no se instancia la aplicación completa cada vez que entra un cliente nuevo. Sería muy ineficiente instanciar toda la aplicación cada vez que un cliente nuevo haga una llamada. El servidor web lo único que hace es crear hilos nuevos para cada cliente, por ello tu aplicación web debe ser "thread safe".

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: ejecuta, programación-general, service, tiempo, veces
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:18.