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

Thread dentro de un TimerTask

Estas en el tema de Thread dentro de un TimerTask en el foro de Java en Foros del Web. Hola. Tengo un problema con java. Tengo una interfaz swing que se puede cerrar en cualquier momento pero por debajo cada X tiempo quiero que ...
  #1 (permalink)  
Antiguo 02/03/2011, 05:23
 
Fecha de Ingreso: agosto-2010
Mensajes: 28
Antigüedad: 14 años, 3 meses
Puntos: 0
Thread dentro de un TimerTask

Hola.

Tengo un problema con java. Tengo una interfaz swing que se puede cerrar en cualquier momento pero por debajo cada X tiempo quiero que se esté ejecutando una consulta y una inserción de una BD a otra.

Si cierro de golpe la interfaz la consulta podría quedar a mitad y no pasarse bien los datos, por lo que creo que necesito crear un Thread y hacer el join antes de llamar al exit de programa para que el hilo termine. Pero claro, si quiero programar esta acción cada cierto tiempo necesito de un Timer, y al meter el Thread dentro del TimerTask es donde me está dando errores. Me lanza el hilo la primera vez pero luego se queja con IllegalThreadStateException.

¿Alguna idea de cómo resolver esto? Ya había pensado con un Thread llamando a sleep dentro de un while (true) pero entonces al hacer el join el hilo nunca muere y no puedo salir de la aplicación.

Saludos y gracias de antemano.
  #2 (permalink)  
Antiguo 02/03/2011, 12:25
Avatar de sivadmp  
Fecha de Ingreso: febrero-2011
Ubicación: La Paz - Bolivia
Mensajes: 293
Antigüedad: 13 años, 9 meses
Puntos: 20
Respuesta: Thread dentro de un TimerTask

hola

para evitar que las consultas SQL no se interrumpan, puedes hacer evitar cerrar tu aplicación

es decir cuando uno presione el botón cerrar, que te aparezca un mensaje de confirmación.

este codigo te puede servir

Código java:
Ver original
  1. this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
  2.         this.addWindowListener(new WindowAdapter() {
  3.             public void windowClosed(WindowEvent e) {
  4.                 JOptionPane.showConfirmDialog(null, "Esta seguro de cerrar la aplicacion");
  5.             }
  6.  
  7.             public void windowClosing(WindowEvent we) {
  8.                 JOptionPane.showConfirmDialog(null, "Esta seguro de cerrar la aplicacion");
  9.             }
  10.         });
  #3 (permalink)  
Antiguo 02/03/2011, 21:13
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Thread dentro de un TimerTask

Hola,

Cita:
Iniciado por KLap Ver Mensaje
... Si cierro de golpe la interfaz la consulta podría quedar a mitad y no pasarse bien los datos, por lo que creo que necesito crear un Thread y hacer el join antes de llamar al exit de programa para que el hilo termine. ...
El problema no es de Java, es de base de datos transaccional e integridad, las operaciones atómicas se realizan en una sola transacción, o se logra toda la operación (commit) o se desecha (rollback). Aun cuando logres sincronizar los Threads a su máxima exactitud con un simple fallo puede quedar una operación a medias. En el mundo de J2EE existen las transacciones a nivel de Java, pero en J2SE tendrías que recurrir a las instrucciones transaccionales de la base de datos que estas usando.

Saludos,

Transacciones en JDBC:
http://download.oracle.com/javase/tu...nsactions.html

Transacciones en Oracle:
http://download.oracle.com/docs/cd/B...4/c17trans.htm

Transacciones en J2EE:
http://www.javaworld.com/jw-07-2000/...ansaction.html
  #4 (permalink)  
Antiguo 03/03/2011, 06:52
 
Fecha de Ingreso: agosto-2010
Mensajes: 28
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Thread dentro de un TimerTask

@sivadmp gracias pero eso no ayudaría, porque aunque salga el cuadro de dialogo, una vez le dan a si, si el proceso de la consulta seguía en background se cierra igual.

@HackmanC no es exactamente eso. Me voy a explicar mejor.
Yo hago una consulta con un PreparedStatement a la BD1 y ya la tengo almacenada en mi ResultSet. Desde mi aplicación Java, proceso esta consulta y con un método hago otro Statement a la BD2 para ir insertando cada una de las tuplas de la primera consulta.

Si cierro la aplicación, obviamente Java se queda a mitad y no mete todas las tuplas, por lo que si tenía 100 tuplas en la BD1 y cuando estoy haciendo mediante mi app java los inserts en la BD2 cierro, me quedo con 50 tuplas en la BD2 y es lo que no quiero que pase. Obviamente si se va la luz etc. tendré que hacer algún tipo de recover comprobando lo que se metió la última vez. Pero esto lo quiero sobre todo por si el usuario va a cerrar la app, que esta espere a que se termine el proceso de inserción.
  #5 (permalink)  
Antiguo 03/03/2011, 20:20
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Thread dentro de un TimerTask

Cita:
Iniciado por KLap Ver Mensaje
Si cierro la aplicación, obviamente Java se queda a mitad y no mete todas las tuplas, por lo que si tenía 100 tuplas en la BD1 y cuando estoy haciendo mediante mi app java los inserts en la BD2 cierro, me quedo con 50 tuplas en la BD2 y es lo que no quiero que pase. Obviamente si se va la luz etc. tendré que hacer algún tipo de recover comprobando lo que se metió la última vez. Pero esto lo quiero sobre todo por si el usuario va a cerrar la app, que esta espere a que se termine el proceso de inserción.
Eso se llaman transacciones ... o se ingresan las 100 o no se ingresa ninguna. Y es por lo mismo de no tener que estar restaurando copias de seguridad si falla algo. Si falla cada semana vas a estar muuuuy ocupado si no usas transacciones :) .

Pero para esperar o mostrar un mensaje de confirmación, concuerdo que el método propuesto por sivadmp es el mas adecuado, solamente tienes que agregar un 'flag' boolean con el estado (terminado / no terminado), si el estado es no terminado que no salga de la aplicación y muestre el mensaje de confirmación.

Saludos

Etiquetas: timertask, threads
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 17:19.