2010-01-14 6 views
9

Vorremmo servire alcune richieste client all'interno del nostro server di applicazioni Java EE (JBoss 4.2.3). Ho letto che il Java EE spec doesn't allow opening a socket from an enterprise bean. Ma le specifiche non suggeriscono alternative.Come servire un socket da un'applicazione Java EE?

In particolare, i fagioli di impresa non dovrebbe:

  • ascolto su, accettare connessioni su, o multicast da un socket di rete

Quindi la domanda è: che cosa posso fare per servono alcuni protocolli basati su TCP binario tcp (non http) all'interno di un server di applicazioni?

Here qualcuno suggerisce di implementare un resource adapter. È questo il modo in cui devi andare o ci sono altre (più facili) soluzioni?

risposta

1

In questo momento mi implementare una soluzione:

alt text http://yuml.me/7f82bd5c

ho utilizzare un'applicazione Java autonoma che accetta le chiamate TCP dal client e inoltra loro come JNDI chiama al server delle applicazioni.

+2

JNDI (Java Naming and Directory Interface) di solito si effettuano chiamate di ricerca, è possibile cercare un ejb e effettuare chiamate remote per elaborare i dati ricevuti dal proprio server standalone. – stacker

2

non si dovrebbe accedere ai file :(

Questo è nelle specifiche EJB perché devono essere:

  • distribuibile (non si sa in anticipo su quale server/esempio il vostro EJB verrà distribuito
  • il contenitore è quello di essere in grado di gestire "tutto", quindi non è necessario generare le proprie discussioni

questo in mente nulla fermerà voi da startin ga socket del server nella tua app (il posto migliore sarebbe probabilmente in un servlet) ma dovresti fare attenzione a come il server viene chiuso quando la tua app va giù ...

7

Hai ragione, dal momento che è possibile dichiarare le transazioni per ogni cosa in Java EE devono essere supportati da tutti i componenti che si desidera connettere. I file dovrebbero essere memorizzati in un database. Tutto dovrebbe essere controllato dal contenitore, perché è l'unico modo per avere un'applicazione di ridimensionamento usando Java EE.

Alcune opzioni:

  • implementare un connettore (JCA) un esempio è qui: http://www.theserverside.com/tt/articles/article.tss?l=J2EE1_4 clienti probabilmente il modo migliore se si è già esistenti.

  • Usa Java Message Code

  • Il rapporto tra questa tecnica è discusso qui http://java.sun.com/products/jms/faq.html#relship_ejbs

  • scrittura del server che memorizza le richieste nel database. (Nessun supporto Tx)

  • Se hai solo un server e sembra troppo sovraccarico, potresti ignorare questi aspetti di e seguire il suggerimento di Vinegars. Ma se hai bisogno di Tx più tardi o di ulteriori nodi questa parte deve essere ridisegnata.

+1

+1: Grazie per il collegamento all'esempio JCA. – tangens

+1

nota che questo esempio JCA è per JCA 1.5 e l'articolo è del 2003. Questo copre JCA 1.6 incluso in javaEE 6, quella versione è molto meno amante dell'XML: http://www.oraclejavamagazine-digital.com/javamagazine/ 20120910 /? Pg = 56 & pm = 1 & u1 = amico # pg56 –

+1

Sto provando un bean con Singleton e Startup e serializzando eventi tramite Messaggi. Dopo @pgras ha osservato "Non pensavo che nulla ti impedisse di avviare un socket del server nella tua app" sembra abbastanza sicuro. – stuartw

0

Ho utilizzato una soluzione in qualche modo simile a quella richiesta in Spring MVC. Potrebbe essere questo può aiutare qualcuno qui intorno.

Avvia una porta socket all'avvio del server. Ho usato l'annotazione @scheduler mentre è possibile utilizzare anche la soluzione basata su listener. È inoltre possibile implementare il listener ApplicationContextAware e accedere ad altri bean di applicazioni da esso.

@Scheduled(fixedDelay = 1000 * 60 * 60 * 24 * 365) 
public void startListenerPort() { 
    ServerSocket socket = new ServerSocket(9999); 
    // do some stuff here 
} 

Accertarsi solo di aver consentito il traffico TCP sulla porta che è stata assegnata al socket (Impostazioni firewall).

In questo modo, è possibile avere traffico TCP sulla porta 9999, dove il server delle app continuerà a funzionare su porte diverse come di consueto.

0

Anche se non strettamente una connessione TCP, ma è possibile ottenere ciò che è necessario con un'annotazione @ServerEndpoint per creare un WebSocket dalle specifiche Java EE7.

Anche se questo utilizza HTTP, funzionerà un po 'come un'interfaccia binaria quando il metodo @OnMessage e un ByteBuffer (o byte[]) come argomento.