2013-01-21 9 views
7

In realtà, ho il seguente flusso:gestione delle operazioni di tempo molto lunghi con Java

  1. utente clicca in "vasta operazione" pulsante;
  2. Chiama un servizio RESTful;
  3. Il servizio di restituzione chiama HugeOpServiceBean, che è un EJB;
  4. Questo EJB dirà alla coda JMS di eseguire HugeOperation;
  5. Questo HugeOperation potrebbe avere due o più implementazioni, così, ogni MDBean che è in ascolto per esso verrà eseguito (il che significa che potrebbe essere in un altro .ear)

mi piacerà sentire come voi ragazzi fare o suggerirmi di rendermi capace di ottenere lo "status" di questi MDBeans.

Fondamentalmente, ogni MDBean eseguirà alcuni metodi in un elenco di alcuni tipi di oggetto, quindi, calcolare la percentuale eseguita dovrebbe essere semplice, io proprio non so come e quale sia la migliore decisione architettonica che potrei prendere per rendere questo accessibile in alcuni servizi RESTful.

Grazie in anticipo.

risposta

2

Poiché il consumo e il trattamento di MDB vengono eseguiti, è tutto o niente. Mostrare i progressi sarà complicato e richiederà sub-transazione per aggiornare i progressi. Vorrei suggerire di eseguire il chunk del lavoro in più messaggi JMS nel bean e monitorare i progressi in termini di messaggi JMS consumati in seguito. Vedi Patterns of Enterprise Integation

+0

Sarebbe bello, tranne che gli MDBeans potrebbero essere in orecchie diverse, che non dovrebbero conoscersi. Gli MDBeans compilano la lista delle cose da cambiare (che generalmente sono specificate nell'orecchio di mdbean), quindi, non posso delegarlo all'EJB. Inoltre, il mio EJB non può sapere quali orecchie sarebbero in alto e ascoltare. Quale modello mi puoi suggerire in questo caso? – caarlos0

+0

@ caarlos0 Immagino che il primo MDB possa funzionare per altri MDB. – ewernli

6

Il modo RESTful di gestire questo sarebbe quello di:

  1. restituire un codice di stato HTTP 202 'accettato' al cliente, dopo la prima chiamata, per indicare che la richiesta ha avuto successo, ma l'ulteriore elaborazione è necessario. È anche possibile fornire un URI con la risposta che il client può utilizzare per interrogare lo stato del "lavoro"
  2. Implementare un endpoint che il client può chiamare per richiedere lo stato del lavoro.
  3. Al termine dell'operazione, l'endpoint da 2) in alto emetterebbe un reindirizzamento permanente all'URI effettivo dell'entità principale creata dall'operazione.
+0

Buona risposta. Come mi suggerisci di ottenere lo stato degli MDBeans? Non ho mai fatto niente del genere ... – caarlos0

+0

Non penso che tu voglia interrogare lo stato degli MDB. Al termine dell'operazione, invece, puoi scrivere il suo stato su una tabella che può essere interrogata da altri EJB in seguito. – Perception

+0

@Perception Penso che l'OP stia parlando dello stato dell'operazione corrente. Quindi averlo scritto dopo la transazione sembra inutile. – SpaceTrucker