Quiero ejecutar el proceso en segundo plano en paralelo con mi aplicación web spring-mvc. Necesito una manera de comenzar automáticamente en la carga de contexto. El proceso en segundo plano es una clase que implementa Runnable
. ¿Spring-mvc tiene algunas instalaciones para eso?¿Cómo crear un proceso en segundo plano en la aplicación de primavera?
Respuesta
Spring tiene un marco integral de ejecución de tareas. Vea el relevant part of the docs.
Sugiero tener un Spring Bean en su contexto, que, cuando se inicializa, envía su fondo Runnable
a un SimpleAsyncTaskExecutor
bean. Ese es el enfoque más simple, que puede hacer más complejo y capaz como mejor le parezca.
Me gustaría seguir adelante y mirar la documentación de programación de tareas vinculada por skaffman, pero también hay una manera más simple si todo lo que realmente desea hacer es iniciar una cadena de fondo en el momento de inicialización del contexto.
<bean id="myRunnableThingy">
...
</bean>
<bean id="thingyThread" class="java.lang.Thread" init-method="start">
<constructor-arg ref="myRunnableThingy"/>
</bean>
Como otra opción, ahora se puede usar la capacidad de programación de Spring. Con Spring 3 o superior, tiene una anotación tipo cron que le permite programar tareas para ejecutar con una simple anotación de un método. También es amigable con el autocableado.
Este ejemplo programa una tarea por cada 2 minutos con una espera inicial (al inicio) de 30 segundos. ¡La próxima tarea se ejecutará 2 minutos después de que el método se complete! Si desea que se ejecute cada 2 minutos exactamente, utilice fixedInterval en su lugar.
@Service
public class Cron {
private static Logger log = LoggerFactory.getLogger(Cron.class);
@Autowired
private PageService pageService;
@Scheduled(initialDelay = 30000, fixedDelay=120000) // 2 minutes
public void cacheRefresh() {
log.info("Running cache invalidation task");
try {
pageService.evict();
} catch (Exception e) {
log.error("cacheRefresh failed: " + e.getMessage());
}
}
}
Asegúrese de añadir también @EnableAsync @EnableScheduling a su clase de aplicación para activar esta función.
- 1. php ejecutar un proceso en segundo plano
- 2. iOS - Cómo completar un proceso largo en segundo plano
- 3. ¿Cómo se inicia un proceso en segundo plano en Perl?
- 4. ¿Cómo ejecuté() un proceso en segundo plano en C?
- 5. ¿Cómo crear una aplicación Cocoa en segundo plano?
- 6. Valor devuelto del proceso en segundo plano
- 7. ¿Genera un proceso en segundo plano en Ruby en Windows?
- 8. cómo controlar (iniciar/matar) un proceso en segundo plano (aplicación de servidor) en ruby
- 9. Inicie un proceso en segundo plano en Linux con C
- 10. ¿Cómo crear un complemento en phonegap para ejecutar la aplicación en segundo plano?
- 11. Rieles Creación de nuevo subproceso o proceso en segundo plano
- 12. Enviar comando a un proceso en segundo plano
- 13. Enviar una tarea en segundo plano desde la aplicación mvc de primavera
- 14. cómo ejecutar la aplicación en segundo plano en android?
- 15. Aplicación que se ejecuta en segundo plano
- 16. Cómo ejecutar un proceso ~ 30sec en segundo plano cada hora (aplicación iphone)
- 17. Para identificar el proceso en segundo plano y ponerlo en primer plano en C++ WIN32
- 18. Crear proceso en segundo plano en ventanas sin ventana de consola visible
- 19. proceso en segundo plano en java escuchando stdin
- 20. Aplicación en segundo plano sin ui
- 21. nohup: ejecutar el proceso de PHP en segundo plano
- 22. cómo ejecutar mi aplicación en segundo plano en iphone?
- 23. ¿Cómo ejecutar siempre un servicio en segundo plano?
- 24. Cómo ejecutar una aplicación de consola .NET en segundo plano
- 25. ¿Cómo ejecutar una aplicación de Android en segundo plano?
- 26. PHP exec() como proceso en segundo plano (Windows Wampserver Environment)
- 27. iOS: mantener la aplicación ejecutándose en segundo plano
- 28. iOS procesado en segundo plano
- 29. Cómo puedo crear una aplicación en WPF que se ejecuta en segundo plano
- 30. ¿Cómo puedo usar nohup para ejecutar el proceso como proceso en segundo plano en Linux?
¿Funciona bien con el apagado del contexto, etc.? –
Esa es una buena pregunta, el cierre puede ser complicado. Lo ideal es que quieras hacer un 'interrupt()' seguido de un 'join()'. Desafortunadamente, no creo que puedas tener dos 'destroy-method's, así que lo mejor que puedes hacer es' destroy-method = "interrupt" '. Para un comportamiento correcto de apagado, recomendaría implementar [Lifecycle] (http://docs.spring.io/spring/docs/4.1.0.BUILD-SNAPSHOT/javadoc-api/org/springframework/context/Lifecycle.html) o [SmartLifecycle] (http://docs.spring.io/spring/docs/4.1.0.BUILD-SNAPSHOT/javadoc-api/org/springframework/context/SmartLifecycle.html) – washley
Implementar una interfaz de resorte no está en el espíritu de mi respuesta original, por supuesto. – washley