2010-02-22 20 views
6

Ho installato un'applicazione Wicket + Hibernate + Spring che prevede la raccolta di alcuni dati (con alcuni file generati e restituiti), l'archiviazione in un database, la creazione di alcune immagini e la visualizzazione di tutto questo su una pagina web.Wicket: come gestire le attività di lunga durata

Questo funziona perfettamente per le tirature brevi, ma a volte la raccolta dei dati (che comporta alcuni scricchiolii di numeri remoti) richiede troppo tempo (20+ minuti) e scade. Ho provato a risolvere questo problema utilizzando due approcci, ma entrambi mostrano alcuni problemi.

Il primo approccio utilizzava AjaxLazyLoadPanel s e faceva semplicemente tutto all'interno di getLazyLoadComponent. Questo ha funzionato bene per le tirature brevi, ma per le corse di 20+ minuti i LazyLoadComponents non si caricavano (bel ossimoro lì) a causa di timeout.

Il secondo approccio prevedeva la creazione di un frammento intermedio con un valore aggiunto AjaxSelfUpdatingTimerBehavior con una durata impostata su 10 secondi, che eseguiva il polling per i file creati nel crunch del numero. Sembra che le attività vengano eseguite in background senza problemi, ma non riesce quando i dati restituiti devono essere memorizzati nel database. Sto usando il modello Open Session in View, ma forse questo non riesce quando si tenta di memorizzare i dati dopo 20 minuti ?? (La soluzione potrebbe risiedere nella risoluzione di questo ..).

A causa dei problemi di cui sopra ora sto leggendo su approcci alternativi per gestire questi compiti lunga corsa e mi sono imbattuto:

Ora sto chiedendo se uno di questi potrebbe essere più adatto a risolvere i problemi di time-out che sto avendo sia nell'esecuzione delle attività e nella memorizzazione dei dati nel database in seguito, o se qualcuno ha altre soluzioni che potrebbero aiutare in questa situazione.

Mi piacerebbe davvero sapere se un nuovo approccio è fattibile prima di passare un altro giorno a implementare qualcosa che potrebbe rivelarsi non funzionare dopotutto.

Con i migliori saluti,
Tim

risposta

3

So che abbiamo avuto successo nel usando un pannello con un AjaxSelfUpdatingTimerBehavior allegato. L'attività e il pezzo dei risultati sono separati dalla logica della vista, ma sono resi accessibili per la vista tramite un servizio creato dall'utente. L'implementazione del servizio che abbiamo utilizzato è quindi responsabile dell'avvio di TheadPool o ExectutorService per l'esecuzione delle singole attività. Il servizio può fornire un modo per monitorare lo stato/avanzamento del particolare lavoro/chiamata in corso. Una volta completato, dovrebbe anche rendere disponibili i dati per la vista. L'iniezione di SessionFactory nell'implementazione del servizio (o DAO iniettato) dovrebbe essere sufficiente per creare HibernateSession all'esterno di una WebSession.

+0

Grazie, è una cosa a cui ho pensato dopo aver postato la domanda (formulare una domanda è proprio come il ducking di gomma in quel modo). Dovrò ancora scoprire se questo risolverà effettivamente il problema, in quanto i registri non registrano nulla sulle sessioni scadute. Solo l'assenza dei risultati nel database è pertinente. Aggiornerà se trovo di più. – Tim

+1

Finito andando per questo approccio e non ho avuto alcun problema dal .. Grazie! – Tim

+0

Buono a sentire Tim! – Matt

Problemi correlati