Tengo que crear un componente en angular que limpie los datos en la base de datos (a través de una llamada de servicio) cada hora y muestre el último tiempo de limpieza en HTML. par de preguntas
@Component({ selector: 'demo-app', template:` <button (click)="clearData()"></button> <h2>Last synced time: {{ time }}</h2> ` }) export class AppComponent { public time; constructor(private demoService: DemoService) { } // ----> this should be triggered every hour <---- clearData() { this.demoService.deleteData() .subscribe((lastCleanTime) => {this.time = lastCleanTime;}); } }
No prefiero hacer eso a través del lado del cliente, está bien agregar un botón para ejecutarlo, solo imagina estos casos:
Prefiero hacerlo desde el lado del servidor, y puede actualizar la hora a través de una API para obtener la última hora o puede agregar un WebSocket para que esté siempre actualizado.
De hecho, una tarea de limpieza de la base de datos debe ejecutarse periódicamente en el lado del servidor. En proyectos Java en los que he participado, hemos realizado tareas similares con Tomcat o Jetty utilizando ServletContextListener . Otros servidores, por ejemplo, node, tienen sus propios mecanismos, por supuesto.
Usted crea una clase que implementa esta interfaz, cuyos métodos se llaman cuando su servlet se inicia o se destruye. En el método de inicio, crea un hilo que limpia la base de datos en un bucle cada hora, hasta que se destruye el servlet:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class DBCleanupContextListener implements ServletContextListener { private ExecutorService threadPool; private DBCleanupTask dbCleanupTask; public DBCleanupContextListener() { threadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); dbCleanupTask = new DBCleanupTask(); } @Override public void contextInitialized(ServletContextEvent arg0) { threadPool.execute(dbCleanupTask); // submit additional tasks here if needed... } @Override public void contextDestroyed(ServletContextEvent arg0) { dbCleanupTask.shutdown(); threadPool.shutdown(); } class DBCleanupTask implements Runnable { boolean finished = false; @Override public void run() { while (!finished) { System.out.println("db cleanup code goes here ...."); try { Thread.sleep(60 * 60 * 1000); // sleeps 1 hour = 60min*60sec*1000ms } catch (InterruptedException e) { finished = true; } } } public void shutdown() { finished = true; } } }
He ejecutado este código con Tomcat, Jetty y Spring Boot. En teoría, debería ejecutarse en cualquier servidor JavaEE, pero debe investigar cómo configurar el servlet. En Tomcat, por ejemplo, debe agregarse a web.xml, como se describe aquí :
<web-app ...> <listener> <listener-class> com.example.DBCleanupContextListener </listener-class> </listener> </web-app>
1 Sí, los datos de los componentes se borran cuando navega de un componente a otro. si desea hacer algo antes de que el componente se destruya, puede usar el método ngOnDestroy Lifecycle del componente.
2 puede usar el servicio para almacenar datos mientras navega entre componentes.