2012-10-30 15 views
6

Sto utilizzando CXF per generare classi di client SOAP. Nel CXF documentation, scrivonoI thread client proxy CXF sono sicuri?

I thread del client proxy JAX-WS sono sicuri?

Risposta ufficiale JAX-WS: No. Secondo le specifiche JAX-WS, i proxy client NON sono thread-safe. Per scrivere codice portatile, devi considerarli come non thread-safe e sincronizzare l'accesso o utilizzare un pool di istanze o simili.

Risposta CXF: i proxy CXF sono thread-safe per MOLTI casi d'uso. Le eccezioni sono:

(che sto omettendo la loro descrizione di questi casi d'uso)

Per la maggior parte "semplici" casi d'uso, è possibile utilizzare i proxy CXF su più thread. Quanto sopra delinea le soluzioni alternative per gli altri.

Qualcuno ha esperienze contrarie? Si sono verificati problemi di multi-threading che non sono descritti nelle loro faq? O la loro descrizione è accurata e sono sostanzialmente sicuri da usare?

+0

Che cosa significa esattamente? Questo significa che i Proxy client ** come generati da CXF 'wsdl2java' ** sono (per lo più) sicuri per i thread, o hai bisogno di utilizzare le API CXF reali nel tuo programma client? –

+0

@MaartenBoekhold Intendevo i proxy client generati. – Eyal

risposta

6

Recentemente abbiamo avuto una discussione simile nel nostro progetto. Come specificato nelle FAQ a cui ci si sta riferendo, ad eccezione delle funzionalità che modificano al volo il conduit HTTP (ad esempio, le funzioni di gestione della sessione e di failover), il proxy client CXF è thread-safe. Quindi, se non si utilizzano queste funzionalità, è possibile condividere il proxy client tra i thread.

1

Probabilmente ti stai riferendo al runtime, ma non penso che il tempo di configurazione sia pensato per essere sicuro. Credo di aver visto una condizione di gara in JettyHTTerverEngineFactory.

In un'imbracatura di test vengono richiamati più server SOAP non collegati e quando condividono un bus è possibile che si verifichi una condizione di competizione se più thread tentano di aggiungere istanze di JettyHTTerverEngine allo stesso tempo. La condizione di competizione specifica è in setTLSServerParametersForPort(), che viene chiamata quando si desidera utilizzare HTTPS per una porta. Questo metodo aggiunge elementi a una HashMap senza alcun blocco.

Immagino che la ragione per cui gli altri non si imbattono in questo è che molte persone configurano CXF tramite i file di configurazione, ed è raro avere più porte/server Jetty in un unico processo.

+0

E si scopre che una versione più recente di CXF risolve questa particolare condizione di competizione, ma non ho visto un contratto definitivo sul threading nella documentazione di CXF. Inoltre, la mappa è statica, quindi la condizione di competizione nella versione precedente avviene indipendentemente dal bus. –

Problemi correlati