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

Controlar que se llame a un Metodo Web por orden.

Estas en el tema de Controlar que se llame a un Metodo Web por orden. en el foro de .NET en Foros del Web. Buenas foreros !!! Vereis, tengo una clase estatica (TareasBL) la cual tiene un método que ejecuta en una Hebra una serie de comprobaciones en BBDD. ...
  #1 (permalink)  
Antiguo 22/09/2009, 12:00
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Controlar que se llame a un Metodo Web por orden.

Buenas foreros !!!

Vereis, tengo una clase estatica (TareasBL) la cual tiene un método que ejecuta en una Hebra una serie de comprobaciones en BBDD. Recoge unos datos de una tabla, comprueba que existan en otra tabla y sino existen, los inserta.

Este método, puede ser llamado desde varias paginas y obviamente, desde varios clientes.

Claro... el problema está, en que si se llama dos veces al método, prácticamente a la vez, puede que se repitan datos en la tabla de la BBDD.

La clase mas o menos es asi (El codigo esta en el trabajo)
Código:
Public Class TareasBL

         Public Static Property GetInstance TareasBL
         End Property


         Public Sub RealizarComprobacion()
      
                   Call New Thread(AddressOf BeginRealizarComprobacion).Start()
         End Sub


         Private Sub BeginRealizarComprobacion()

                    'Recupero registros de una tabla.
                    'Compruebo si existen en otra tabla.
                    'Inserto en la tabla los que no existan.
         End Sub
End Class
Me gustaría, alguien que esté experimentado en el tema, que soluciones me puede dar... si antes de hacer lo de la BBDD, meter las ordenes en una Pila, o algo similar, etc...

Pensé en meter en el método privado el siguiente atributo, pero me gustaría saber la opinión de alguien expermientado en el tema, si con esto podría solucionar el problema... o por lo menos que me orienten.
Código:
         <System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.Synchronized)> _
         Private Sub BeginRealizarComprobacion()

                    'Recupero registros de una tabla.
                    'Compruebo si existen en otra tabla.
                    'Inserto en la tabla los que no existan.
         End Sub
Desde ya, muchas gracias por su ayuda.

Espero haberme explicado bien. Saludos.
__________________
Charlie.
  #2 (permalink)  
Antiguo 22/09/2009, 12:56
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Controlar que se llame a un Metodo Web por orden.

q onda, tu problema mas que de sincronizacion lo veo como un problema de transaccionabilidad, lo que debes es ver como manejas tu inserccion de datos y consulta para evitar shadow reads y para ello tienes en las transacciones un nivel de isolation, que en este escenario al no ser propiedades de una clase si no datos traidos de una BD debera ser el mas pesimista posible.

revisa http://msdn.microsoft.com/es-es/libr...el(VS.80).aspx

pero puedes probar usando un MessageQueue para procesar por FIFO por si tu tendencia de multiples solicitudes simultaneas no requiere tanta sofisticacion y mas practicidad
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #3 (permalink)  
Antiguo 22/09/2009, 13:55
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Respuesta: Controlar que se llame a un Metodo Web por orden.

Y el objeto MessageQueue encargado de almacenar las peticiones... ¿Donde crees que debo guardarlo para que se use para toda la aplicación?

¿En el application será correcto?
__________________
Charlie.
  #4 (permalink)  
Antiguo 22/09/2009, 14:14
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Controlar que se llame a un Metodo Web por orden.

el messagequeue requerira una dependencia propia con tu server, mas que con la aplicacion tu server debera tener el messagequeue service ejecutandose y deberas definir un messagequeue comun para todos tus clientes para que asi si pepe lopez en la terminal 1 hace un update juan perez en la termina 15k tenga q esperar a q su solicitud sea despachada por el server. no importando si el hace 10k peticiones, para la computadora y el servicio hasta las ticks de reloj cuentan para saber quien entro primero.
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #5 (permalink)  
Antiguo 22/09/2009, 14:20
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Respuesta: Controlar que se llame a un Metodo Web por orden.

Bueno entiendo que tenga que crear una Cola en el MessageQueueServer.

Pero despues, cuando cree el objeto MessageQueue, ¿Lo creo en el Application? O me voy a tener que crear un .exe o un servicio windows, donde tenga el ese MessageQueue sacando las peticiones de la cola y procesándolas ?

Me gustaría saber si puedo procesar las peticiones de alguna forma sin tener que crear ningún servicio windows ni nada...
__________________
Charlie.
  #6 (permalink)  
Antiguo 22/09/2009, 14:28
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Controlar que se llame a un Metodo Web por orden.

tendrias que crear un servicio o un aplicacion con un timer que fuera viendo cada peticion en la cola.

a menos que programes usando integration services de sql server , pero caerias en el mismo escenario de crear algun procesador de esas peticiones.
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #7 (permalink)  
Antiguo 22/09/2009, 14:33
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Respuesta: Controlar que se llame a un Metodo Web por orden.

Ok... vamos, que nadie me salva de tener que crear un "demonio" para poder hacer lo que quiero...

Muchas gracias.
__________________
Charlie.
  #8 (permalink)  
Antiguo 22/09/2009, 14:38
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Controlar que se llame a un Metodo Web por orden.

claro que la opcion de le transaccionabilidad te salvaria pero deberias revisar que tantas peticiones y tu modelo de worst scenario para los inserts y selects.
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #9 (permalink)  
Antiguo 22/09/2009, 17:08
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 3 meses
Puntos: 50
Respuesta: Controlar que se llame a un Metodo Web por orden.

Y no te sirve usar
Application.Lock()
'Código
Application.UnLock()

???

Cita:
que nadie me salva de tener que crear un "demonio" para poder hacer lo que quiero...
Y porque no lo quieres hacer con un demonio?? antes de contestar ésto dime ti te sirve lo que te puse en l punto anterior

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #10 (permalink)  
Antiguo 23/09/2009, 02:57
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Respuesta: Controlar que se llame a un Metodo Web por orden.

Bueno, en primer lugar, gracias a todos por contestar y dedicarme un tiempo a este hilo (Siempre hay que ser agradecido, jeje)

Lo que me has comentado de transaccionabilidad y demás Peterpay, para evitarme hacer lo del demonio.. la verdad, no he entendido nada, jaja, me perdí completamente.


RootK, el tema de Application.Lock(), eso sirve para Web ? Entiendo que con eso se puede bloquear controles. Pero lo que necesito es digamos bloquear el método. Que si dos personas llaman al mismo metodo, hasta que no termine de ejecutarse la primera vez, no se ejecute la segunda vez. Para evitar asi, que se llame dos veces a la vez.

Lo del demonio es una opción, pero como es algo de trabajo, el area de sistemas no está por la labor de dejarme instalar un servicio en los servidores.

Me gustaría eso, de alguna forma sencilla prevenir, que si se llaman dos veces al metodo, se ejecuten por orden, y hasta que no termine uno, no empiece el otro... Creo que lo único que valdría es lo del MessageQueue Server.

Pero si me pueden hacer ver que el Application me valdría para lo que necesito o se os ocurren más cosas que me puedan ayudar, os agradecezco me "hagais ver más claro", jeje
__________________
Charlie.

Última edición por chcma; 23/09/2009 a las 03:04
  #11 (permalink)  
Antiguo 23/09/2009, 09:54
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 3 meses
Puntos: 50
Respuesta: Controlar que se llame a un Metodo Web por orden.

Cita:
el tema de Application.Lock(), eso sirve para Web ?
asi es, de hecho es lo que se estila mucho por ejemplo para controlar un contador de visitas, si se llegan a dar 2 o mas peticiones a la vez se enfilan precisamente porque ese método es a nivel application y no a nivel session

Cita:
Entiendo que con eso se puede bloquear controles.
¿bloquear controles? , echale un ojo a la liga que puse para que tengas una mejor
refencia

por cierto:

Cita:
Iniciado por chcma
Recoge unos datos de una tabla, comprueba que existan en otra tabla y sino existen, los inserta.
que BD estás utilizando?? si es el caso de MSSQL no te sirve programar algun JOB o inclusive un ¿ETL?, aclaro que depende del requerimiento

Cualquier cosa por aqui seguimos
  #12 (permalink)  
Antiguo 24/09/2009, 01:26
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Respuesta: Controlar que se llame a un Metodo Web por orden.

Si RootK, un job estaría bien, pero... es política de empresa que estamos muy limitados en estos temas. Ni instalar servicios windows en el servidor, ni tareas, ni historias... Una putada.

Por lo que veo el Application.Lock() se utiliza para bloquear valores de tipo ApplicationState, pero no para bloquear una serie de instrucciones a la BBDD.

De todas formas, lo he solucionado.

Cada vez que alguien haga una operacion, yo quería comprobar todos los registros de una tabla e insertarlos en la otra (Los que no existieran), pero viendo que se me complica. Cada vez que alguien haga una operación, se comprobará solo el registro con el codigo de esa operación. Asi me quito de males. Por como esta la aplicación me lleva un poco más de tiempo, pero bueno... asi soluciono el problema.

Muchas gracias por su ayuda señores.

Un Saludo !!
__________________
Charlie.
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 13:02.