2009-04-23 24 views
6

Ho un'applicazione Web utilizzando la primavera e vanno in letargo e puntoni (funziona su Tomcat)Discussioni in primavera

La sequenza di chiamata è qualcosa di simile ...

Struts azione chiama primavera fagioli servizio che a sua volta chiama bean DAO Spring. L'implementazione DAO è un'implementazione di Hibernate.

La domanda è Tutti i miei fagioli primaverili sarebbero in esecuzione nello stesso thread? Posso archiviare qualcosa nel ThreadLocal e ottenerlo in un altro bean?

Sono sicuro che questo non funzionerebbe in Stateless Session Bean. Il contenitore EJB può (o verrà) generare un nuovo thread per ogni chiamata al bean di sessione

Il contenitore della molla farà lo stesso? ad esempio, esegui tutti i fagioli nello stesso thread?

Quando ho provato un test JUnit -. Ho avuto la stessa id via Thread.currentThread() getId() nel caso di test e le due beans- che mi porta a credere che ci fosse un solo thread in azione

Oppure il comportamento è imprevedibile? O cambierà durante l'esecuzione sul server Tomcat?

Chiarimento Non desidero scambiare dati tra due thread. Voglio mettere i dati nel ThreadLocal ed essere in grado di recuperarlo da tutti i bean nello stack delle chiamate. Funzionerà solo se tutti i bean si trovano nello stesso thread

+0

Potresti postare qualche codice di esempio, per favore? Non sono sicuro di cosa stai cercando di raggiungere. –

risposta

15

Spring non genera i thread. Tomcat sì. Spring sta solo creando e cablando gli oggetti per te.

Ogni richiesta dal browser viene elaborata in un'unica richiesta. È Tomcat che gestisce la richiesta. È Tomcat che crea il thread per elaborare la richiesta.

Supponendo di aver appena creato un bean singleton in primavera chiamato "X". Quindi la stessa istanza di X viene utilizzata da tutte le richieste.

I fagioli di primavera non vivono in una discussione. Sono appena allocati sul mucchio.

+0

Quindi, quando si esegue sotto Tomcat, il flusso end-to-end si troverà sotto un thread? –

+0

Sì, presupponendo che tutto sia nella stessa istanza del server delle app. –

+0

Questa è la migliore spiegazione finora. –

1

Tutti i miei fagioli primaverili sono in esecuzione nello stesso thread? Posso memorizzare qualcosa nel ThreadLocal e ottenere in un altro bean? AFAIK per i componenti che hai citato (bean di servizio, bean DAO - credo che siano semplici bean spring), Spring non genera una nuova discussione. Non capisco il tuo caso d'uso (ad esempio, lo scambio di dati tra due thread).

Per la maggior parte webapps, un nuovo thread viene generato per ogni nuova richiesta, e se si desidera condividere i dati tra due richieste normalmente: - utilizzare i parametri GET/post per passare i dati - utilizzare la sessione per condividere i dati

Per rispondere alla tua domanda, sono abbastanza sicuro che il contenitore a molla non genera i thread per la maggior parte dei componenti.

+0

Non desidero scambiare dati tra due thread. Voglio mettere i dati nel thread ed essere in grado di recuperarlo da tutti i bean nello stack delle chiamate. Funzionerà solo se tutti i bean sono nello stesso thread ... –

0

Sì, puoi farlo.Lo stesso thread verrà utilizzato per eseguire l'azione in modo che ThreadLocal funzioni. In genere, lo stesso thread viene utilizzato anche per il bean di sessione stateless, supponendo che sia in esecuzione nella stessa istanza del server delle app. Non dipenderei comunque da questo, poiché è probabilmente dipendente dal venditore.

Utilizziamo questa tecnica per accedere all'identità del chiamante in qualsiasi punto del codice. Utilizziamo anche bean di sessione e jms, ma passiamo esplicitamente le informazioni tra i contenitori e impostiamo ThreadLocal in ogni punto di ingresso. In questo modo non importa se il bean (session o mdb) è locale o meno.

+0

Non pensavo che in realtà stava usando un bean di sessione stateless? Supponevo che stesse usando i POJO in primavera come alternativa. –

+0

e, per impostazione predefinita, Spring creerà i bean come singleton, il che significa che la stessa istanza è condivisa tra tutte le richieste. Ma se memorizza qualcosa in ThreadLocal, non importa. –

+0

Immagino che il punto su POJO sia corretto, ma ha detto che non pensava che avrebbe funzionato, quindi presumo che questa potrebbe essere un'altra alternativa a cui stava pensando (con o senza Spring). Ho solo pensato di dargli qualche informazione a riguardo, basandomi sulle mie esperienze facendo qualcosa di simile. – Robin

0

Oltre a tutte le altre risposte, sarà sufficiente aggiungere la seguente:

Normalmente l'unico motivo per passare fili è causa di alcuni requisiti per parallellity. Dal momento che normalmente non viene fornito gratuitamente in termini di complessità, di solito si viene informati in modo chiaro quando ciò accade.

Cambiare i thread all'interno di quella che sembra essere un'elaborazione a thread singolo di una richiesta è in realtà estremamente complessa. Questo normalmente si verifica solo in un punto di un contenitore e generalmente viene gestito dai lettori di socket tcp/ip che ricevono la richiesta dai client esterni. Questi thread di lettore di solito determinano quale thread (pool) deve elaborare la richiesta e inoltrare la richiesta a quel thread. Dopo che la richiesta rimane con quel thread.

Quindi normalmente l'unica cosa che può/può succedere è che vengono creati ulteriori thread per la parallelismo o l'elaborazione asincrona (come JMS).