6

我有一个在 Grizzly 实例上运行的 Jersey JAX-RS 应用程序:

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();
    }
}

里面my.package.rest有 JAX-RS 注释资源。我想在同一服务器实例上使用 Tyrus 添加 websocket 注释(、、、等)资源(比如在“ @ServerEndpointhttp://127.0.0.1:8080/websocket @OnOpen),但我能找到的所有文档都显示如何使用 Tyrus + Grizzly 容器启动独立的 websocket 服务器,而不是与 Jersey 结合使用。我正在寻找类似的东西:@OnMessage

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

但我找不到类似的东西SomeTyrusHttpHandler。如何将 Jersey 和 Tyrus 组合在一个 Grizzly 服务器中?

4

1 回答 1

1

好问题,但目前还没有这个问题的好答案。你仍然可以这样做,但需要深入了解 Grizzly 的内部结构;Tyrus 由插件注册(参见WebSocketAddOn),它可以结合 Jersey 方式注册到该容器中。

请记住,将这两个框架集成在一起并非易事——在单个容器中运行它们是第一步,但还有其他一些事情需要注意,例如“实例提供者”、生命周期调整等。我相信这个话题超出了一个 SO 答案的范围——你可以期待我或其他 Tyrus/Jersey 团队成员的博文。(完成后我会在这里发布)。

无论如何,我建议采取更保守的方法并使用一些支持 Servlet 3.1 的轻量级容器;这应该需要更少的工作,并且您将拥有标准的 Servlet 运行时/生命周期。

于 2015-04-21T09:17:35.560 回答