Come creeresti un CDI personalizzato @ProcessScope?

3

Sto codificando un'applicazione Java EE che fornisce servizi REST tramite classi di risorse JAX-RS, l'applicazione fa ampio uso di CDI. Le mie classi di risorse sono @RequestScoped, l'applicazione restituisce lo stato HTTP 202 Accettato al chiamante ed esegue il lavoro in modo asincrono.

Desidero restituire un "ID di processo" in modo che il chiamante possa richiedere periodicamente lo stato generale del "processo" a esecuzione prolungata che sto eseguendo per loro conto.

Durante l'elaborazione di queste richieste, la mia applicazione interagisce in modo asincrono con altri sistemi tramite REST fornendo un "URL di richiamata" che questi server remoti riportano (insieme ai risultati e allo stato) alla mia applicazione quando l'attività assegnata è completa.

Sto cercando un modo per tutti i bean coinvolti nell'esecuzione di un "processo" per condividere uno stato comune per quel "id di processo". Il mio pensiero iniziale era quello di iniettare un bean di stato con un nuovo scope CDI @ProcessScoped per formare un bean pool comune per ogni dato processo.

Il punto cruciale del mio problema è dove conservare questi bean e come raggrupparli? Sembra una situazione di pollo e uova perché CDI avrà bisogno di conoscere l'id di processo per ogni bean dato per riunirli insieme.

Ho letto articoli su come CDI fa questo per i suoi ambiti standard; e ho esaminato il codice di esempio per la creazione di ambiti CDI personalizzati. Ad esempio, @SessionContext utilizza HttpSession dalle specifiche Servlet per archiviare le istanze bean. Poiché il nostro "processo" è alquanto arbitrario, sto cercando di trovare qualcosa che sia comune usare per indicizzare o archiviare questi fagioli.

Idealmente @ProcessScope funzionerebbe in modo trasparente al codice dell'applicazione, cioè l'ID del processo può essere interrogato ma viene creato e gestito solo dall'estensione CDI.

Grazie per qualsiasi aiuto o consiglio o ispirazione che puoi offrire.

    
posta mikee 19.12.2016 - 17:12
fonte

1 risposta

1

Nessuno degli obiettivi integrati può funzionare in questo caso e un ambito personalizzato è il modo migliore per andare. L'ambito della conversazione fallirà perché l'ambito della conversazione viene mantenuto in una sessione http e, quindi, al di fuori di una richiesta http, diventa impossibile ottenere la sessione http. Quello che stai cercando di fare è in qualche modo vicino al nuovo jsf flow-scope (per jsf).

Con l'ambito personalizzato, puoi controllare la durata di vita di questi bean, e quindi hai il margine per memorizzare i bean ovunque tu voglia, anche in una mappa personalizzata (anche serializzata in db se hanno stato). Dovrai inizializzare il nuovo bean per ogni id di processo, in modo che la ricerca di un bean fornisca l'id del processo, o un singolo ID di processo possa recuperare dalla mappa, un insieme di bean corrispondenti.

È possibile definire un'iniezione di istanza che può comportare qualcosa a questo effetto:

@Inject
@Any
Instance<MyBean> processingBeans;

//Somewhere in status call method
Instance<MyBean> processIdBeans = processingBeans.select(SomeQualifierForProcessId(processId));
processIdBeans.forEach((bean) -> bean.getState());
    
risposta data 24.12.2016 - 20:53
fonte

Leggi altre domande sui tag