2012-03-25 17 views
5

Stiamo creando un'app Web in cui è necessario disporre della concorrenza per alcuni casi aziendali. Questa applicazione verrebbe distribuita in un contenitore Tomcat. So che creare thread definiti dall'utente nel contenitore web è una cattiva idea e sto cercando di esplorare le opzioni che ho.Implementazione della concorrenza nell'applicazione Web Java EE

  1. La mia libreria multi-thread utilizzata come componente JCA. Siamo contrari all'utilizzo di questo approccio a causa della curva di apprendimento che potrebbe essere coinvolta.
  2. So che sono disponibili le API di WorkManager ma suppongo che questo non sia implementato da tomcat, quindi questa opzione si spegne.
  3. Ho fatto qualche ricerca e ho scoperto che la libreria CommonJ è consigliata per Tomcat. Qualcuno l'ha usato?
  4. Inoltre, vedo che sono disponibili ManagedExecutorService ma non sono sicuro di come utilizzarlo ed è diverso dalle API di WorkManager (e dalla libreria commonJ)?

Qualsiasi aiuto su questo apprezzato. A proposito, usare JMS è fuori discussione a causa dell'ambiente di distribuzione. Sono incline ai punti 3 e 4 ma non ho molta conoscenza in merito. Qualcuno potrebbe guidare pls.

risposta

4

Dato che stai utilizzando Tomcat, non preoccuparti e fai quello che vuoi. La sezione Servlet di Java EE non fa menzione di thread ecc. Questo è principalmente nella sezione EJB.

Tomcat in sé non fa molto per preoccuparsi della gestione dei thread, è un contenitore piuttosto non invasivo.

È meglio legare i thread a un ServletContextListener in modo da poter prestare attenzione al ciclo di vita dell'applicazione e arrestare i file quando si chiude l'applicazione, ma oltre a ciò, non preoccuparsi eccessivamente di ciò e utilizzare qualsiasi cosa sono felice con.

Addenda -

La semplice verità è Tomcat non si cura, e non è così sofisticato. Tomcat dispone di un pool di thread per ciascun listener HTTP e si tratta della fine del suo livello di gestione. Tomcat non prenderà i thread da un ascoltatore HTTP silenzioso e li dedicherà a uno occupato, ad esempio. Se Tomcat fosse veramente interessato a come si creano i thread, ciò impedirebbe di farlo, e non è così.

Ciò significa che la gestione dei thread al di fuori del contesto HTTP ricade direttamente sulle spalle come implementatore. Java EE espone questo tipo di funzionalità e le interfacce offrono letture eccezionali. Ma la semplice verità è che le capacità teoriche sposate dai documenti Java EE API e la realtà delle implementazioni moderne è molto diversa, in particolare nei sistemi di fascia bassa come Tomcat.

Non denigrare Tomcat. Tomcat è un ottimo software. Ma per la maggior parte dei casi d'uso, la capacità di gestione extra semplicemente non è necessaria.

Configurare il proprio pool di thread (utilizzando le strutture fornite da JDK) e lavorare con il proprio modello di ciclo di vita del thread probabilmente vi vedrà correttamente attraverso qualunque progetto stiate lavorando. Non è davvero un grosso problema.

+0

Non sono sicuro che i thread di generazione siano una buona idea. se Tomcat non conosce i thread, come lo controllerebbe? per esempio. chiudere il contenitore sarebbe un problema se i thread sono in esecuzione e inoltre non dimentichiamo che poiché i thread sono fuori dal controllo di tomcat, i thread saranno in competizione con Tomcat per la memoria. – arya

+0

Arya, Will ha ragione, gestisci le tue discussioni e (fidati del mio dolore) non seguire la rotta EJB/JCA. Il fatto di trovarsi in un contenitore Servlet non modifica la necessità di controllare il pool di thread. Il servizio Executor può aiutarti facilmente a farlo. Legare il ciclo di vita dei tuoi esecutori a quello dei tuoi servlet garantisce l'inizializzazione e lo spegnimento puliti. –

+0

BGR, lo farai, ragazzi, avete un'idea di ManagedExecutorService? sarebbe più appropriato in questo contesto? – arya

0

Ogni servlet - componente base Java EE per l'elaborazione delle richieste HTTP - nell'applicazione Web è un Singleton e ogni richiesta viene eseguita con il proprio thread indipendente, quindi non è necessario avviare/interrompere i thread generati dall'utente da soli. Il tuo contenitore Web, in questo caso Tomcat, gestisce tutte queste cose.

Oltre a ciò, è necessario tenere presente alcune considerazioni sull'elaborazione multi-thread nel codice. Ad esempio, poiché i servlet sono singleton e molti thread sono generati per questa classe è una cattiva idea avere attributi di istanza in questi componenti.

+0

carlos, in realtà la mia domanda è in una direzione completamente diversa. Quello che stai suggerendo è il concetto di base del processo http e questo lo so. ma ci sono situazioni in cui ci sono processi di business invocati dall'utente che richiedono tempo e questo viene fatto attraverso i thread. la richiesta http invocherà solo il processo multi-thread ... il resto del processo sta succedendo contemporaneamente dai thread ... questi thread in questo momento sono thread definiti dall'utente che non mi piacciono. qualsiasi idea su come posso rimuovere l'utilizzo di questi thread definiti dall'utente. – arya

1

Ci sono un paio di opzioni. Indipendentemente dalle restrizioni sui contenitori che potrebbero o meno essere presenti, la generazione di singoli thread su richiesta è quasi sempre una cattiva idea. Non è che questo non funzionerebbe in un ambiente Servlet, ma il numero di thread che è possibile creare potrebbe diventare completamente fuori controllo.

La soluzione più semplice è un semplice pool di thread Java SE vecchio tramite un normale servizio di esecuzione. Avviare il pool in un listener Servlet e fornire l'accesso ad esso tramite alcune variabili statiche. Non eccessivamente carino, ma ha fatto il lavoro. A seconda del caso d'uso esatto, questa potrebbe essere la soluzione migliore (se il tuo caso d'uso è piuttosto di basso livello).

Un'altra opzione è aggiungere OpenEJB alla war e quindi sfruttare l'annotazione @Asynchronous.

Un'altra opzione, è rendersi conto che in genere si utilizza Tomcat se i requisiti aziendali sono estremamente semplici o di basso livello. Questo è praticamente l'intero punto di usare qualcosa come un osso nudo come un Tomcat. Non appena avrai bisogno di aggiungere (tonnellate di) librerie, potresti avere superato Tomcat e potrebbe essere meglio utilizzare un server che ha già la funzionalità necessaria (in questo caso l'esecuzione asincrona). Esempi sono TomEE, GlassFish, Resin, JBoss AS, Geronimo, ecc.

+0

Arjan, il server effettivamente fuori avrebbe un carico pesante su di esso. non troppi utenti concorrenti ma molti utenti che parlano continuamente al server con alcune conversazioni a lungo termine (non necessariamente conversazioni transazionali). diresti che Tomcat sarebbe abbastanza buono per le nostre esigenze? – arya

+0

Ero abituato a lavorare per il fornitore di software come servizio che utilizzava numerosi cluster Tomcat per gestire applicazioni che gestivano decine di milioni di visualizzazioni di pagine al mese per cluster. C'è un equivoco tra molte persone che Tomcat è solo per piccoli progetti, ma non è vero. –

+0

Il numero di visualizzazioni non è quello che intendevo con semplice o piccolo in realtà. Se il codice è semplice, nel senso che non hai bisogno di un'interfaccia utente, di un ORM, ecc, in pratica il tuo codice è "di basso livello" e ovviamente il codice di basso livello esegue milioni di visualizzazioni (abbiamo avuto una parte del nostro un'applicazione in esecuzione su Tomcat che potrebbe facilmente con due dita nel naso fare 6000 transazioni/secondo/server, ma tutta questa cosa ha sostanzialmente accettato le richieste HTTP, inserendo elementi in alcune code di trasferimento ed eventualmente persistendo in batch nel DB, un paio di mille LOC max) –

0

Ho usato CommonJ molte volte e funziona molto bene. Può essere inizializzato e distrutto da un ServletContextListener.

+0

grazie per la risposta cristiana, finalmente ottengo qualcuno con esperienza in CommonJ. quindi la mia prima domanda è che quando uso commonJ, i thread che verrebbero creati, sarebbero in grado di controllare Tomcat? spero che sia abbastanza scalabile .... nella tua esperienza lo consiglieresti per carichi moderatamente pesanti? – arya