【问题标题】:Combine Jersey with Tyrus将泽西岛与 Tyrus 结合
【发布时间】:2015-06-27 08:51:39
【问题描述】:

我有一个在 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 注释(@ServerEndpoint、@OnOpen、@OnMessage 等)资源(比如在“http://127.0.0.1:8080/websocket”中),但我能找到的所有文档展示了如何使用 Tyrus + Grizzly 容器启动独立的 websocket 服务器,而不是与 Jersey 结合使用。我正在寻找类似的东西:

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

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

【问题讨论】:

    标签: websocket jersey jax-rs grizzly tyrus


    【解决方案1】:

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

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

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

    【讨论】:

    • 只需使用 Atmosphere,它完全符合您的要求,并允许在 Grizzly、GlassFish 等之上运行 Jersey。github.com/Atmosphere/atmosphere。例如goo.gl/s7OwGc 是 Jersey 2 在 websocket 之上透明运行的超级简单示例。
    • 参见github.com/pavelbucek/placeholder -- PoC,结合了 Jersey 和 Tyrus(在 Grizzly + HK2 之上)。
    • 您好,请问有这种整合的消息吗?我想在我的 Jersey 项目中添加一个 WebSocket 资源。
    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多