2015-04-20 23 views
5

Ho un'applicazione JAX-RS Jersey che gira su un'istanza di Grizzly:Combina Jersey con Tyrus

public class Application { 
    public static final String BASE_URI = "http://127.0.0.1:8080/rest"; 

    public static void main(String[] args) throws IOException { 
     ResourceConfig rc = new ResourceConfig().packages("my.package.rest"); 
     HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc); 
     System.out.println("Server started, press any key to stop."); 
     System.in.read(); 
     server.shutdownNow(); 
    } 
} 

all'interno my.package.rest ci sono JAX-RS risorse annotati. Vorrei aggiungere websocket annotate (@ServerEndpoint, @OnOpen, @OnMessage, ecc.) Usando Tyrus sulla stessa istanza del server (diciamo in "http://127.0.0.1:8080/websocket") ma tutta la documentazione che sono riuscito a trovare mostra come avviare un server websocket standalone usando Tyrus + un contenitore Grizzly, non combinato con Jersey. Sto cercando qualcosa di simile:

server.getServerConfiguration().addHttpHandler(new SomeTyrusHttpHandler("/websocket")); 

ma non riesco a trovare qualcosa di simile a SomeTyrusHttpHandler. Come posso combinare Jersey e Tyrus in un singolo server Grizzly?

risposta

1

buona domanda, ma al momento non esiste una buona risposta per questo. Puoi ancora farlo, ma sarebbe necessario immergerti profondamente nelle parti interne dei Grizzly; Tyrus è registrato da un addon (vedi WebSocketAddOn) e può essere combinato con la modalità di registrazione di Jersey in quel contenitore.

Si prega di tenere presente che l'integrazione di questi due framework non è una sfida banale: eseguirli in un unico contenitore è un primo passo, ma ci sono altre cose che devono essere prese in considerazione, come "provider di istanze", ciclo di vita aggiustamento, ecc. Credo che questo argomento superi lo scopo di una risposta SO - puoi aspettarti un post da me o da qualche altro membro del team di Tyrus/Jersey su questo. (Lo posterò qui una volta che è fatto).

In ogni caso, consiglierei di adottare un approccio più prudente e utilizzare un contenitore leggero che supporti Servlet 3.1; ciò dovrebbe richiedere molto meno lavoro da parte tua e avrai runtime/ciclo di vita standard di Servlet.

+0

Basta usare Atmosphere, fa esattamente ciò che si desidera e consente di eseguire Jersey in cima a Grizzly, GlassFish ecc. Https://github.com/Atmosphere/atmosphere. Ad esempio http://goo.gl/s7OwGc è un esempio super facile di Jersey 2 che gira in modo trasparente in cima alle websocket. – jfarcand

+0

vedere https://github.com/pavelbucek/placeholder - PoC, che combina Jersey e Tyrus (in cima a Grizzly + HK2). –

+0

Ciao, c'è qualche notizia di tale integrazione? Vorrei aggiungere una risorsa WebSocket al mio progetto Jersey. –