当前位置: 首页 > 知识库问答 >
问题:

嵌入式地下同时部署websocket和servlet,不起作用

刘和昶
2023-03-14
    /*
     * Create the  appWebSocketDeploymentInfo and configure
     */
    WebSocketDeploymentInfo appWebSocketDeploymentInfo = new WebSocketDeploymentInfo();
    appWebSocketDeploymentInfo.setBuffers(new ByteBufferSlicePool(BufferAllocator.BYTE_BUFFER_ALLOCATOR, 17000, 17000 * 16));
    appWebSocketDeploymentInfo.addEndpoint(WebSocketEndpoint1.class);
    appWebSocketDeploymentInfo.addEndpoint(WebSocketEndpoint2.class);

    /*
     * Create the  appDeploymentInfo and configure
     */
    DeploymentInfo appDeploymentInfo = Servlets.deployment()
                                    .setClassLoader(Server.class.getClassLoader())
                                    .setContextPath("/myapp)
                                    .setDeploymentName("app.war")
                                    .setResourceManager(new FileResourceManager(new File("src/main/webapp"), 1024))
                                    .addServlets(Servlets.servlet("HomeServlet", HomeServlet.class).addMapping("/home"))
                                    .setResourceManager(new ClassPathResourceManager(Server.class.getClassLoader(), Server.class.getPackage()))
                                    .addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, appWebSocketDeploymentInfo);

    /*
     * Create the deploymentManager
     */
    deploymentManager = Servlets.defaultContainer().addDeployment(appDeploymentInfo);

    /*
     * Deploy the app
     */
    deploymentManager.deploy();

    /*
     * Create the path handle
     */
    pathHandler = Handlers.path(Handlers.redirect("/myapp/home")).addPrefixPath("/myapp", deploymentManager.start());

    /*
     * Create the server
     */
    undertowServer = Undertow.builder().addHttpListener(DEFAULT_PORT, DEFAULT_IP).setHandler(pathHandler).build();

共有1个答案

通远
2023-03-14

经过广泛的测试和研究,我得到了正确的方法来进行配置和启动服务器,还将添加对其他技术的支持,如:

  • WebSocket
  • resteasy
  • 焊接

我的最后代码:

UndertowJaxrsServer server = new UndertowJaxrsServer();
Undertow.Builder serverBuilder = Undertow.builder().addHttpListener(DEFAULT_PORT, DEFAULT_IP);
ServletContainer servletContainer = Servlets.defaultContainer();

   /*
    * Create the App WebSocketDeploymentInfo and configure
    */
    WebSocketDeploymentInfo appWebSocketDeploymentInfo = new WebSocketDeploymentInfo();
    appWebSocketDeploymentInfo.setBuffers(new    ByteBufferSlicePool(BufferAllocator.BYTE_BUFFER_ALLOCATOR, 17000, 17000 * 16));
    appWebSocketDeploymentInfo.addEndpoint(WebSocketNodeChannelServerEndpoint.class);
    appWebSocketDeploymentInfo.addEndpoint(WebSocketClientChannelServerEndpoint.class);

    /*
     * Create the App ResteasyDeployment and configure
     */
    ResteasyDeployment deployment = new ResteasyDeployment();
    deployment.setApplicationClass(JaxRsActivator.class.getName());
    deployment.setInjectorFactoryClass("org.jboss.resteasy.cdi.CdiInjectorFactory");

    /*
     * Create the App DeploymentInfo and configure
     */
    DeploymentInfo appDeploymentInfo  = server.undertowDeployment(deployment, APP_NAME);
    appDeploymentInfo.setClassLoader(FermatEmbeddedNodeServer.class.getClassLoader())
                    .setContextPath(APP_NAME)
                    .setDeploymentName(WAR_APP_NAME)
                    .addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, appWebSocketDeploymentInfo)
                    .addServlets(Servlets.servlet("HomeServlet", HomeServlet.class).addMapping("/home"))
                    .addListeners(Servlets.listener(org.jboss.weld.environment.servlet.Listener.class));

    server.deploy(appDeploymentInfo);
    server.start(serverBuilder);
compile 'io.undertow:undertow-core:1.3.6.Final'
compile 'io.undertow:undertow-servlet:1.3.6.Final'
compile 'io.undertow:undertow-websockets-jsr:1.3.6.Final'

compile 'org.jboss.resteasy:resteasy-undertow:3.0.13.Final'
compile 'org.jboss.resteasy:resteasy-cdi:3.0.13.Final'
compile 'org.jboss.weld.servlet:weld-servlet:2.3.1.Final'

compile 'javax:javaee-api:7.0'
 类似资料:
  • 当我运行ear项目时,在war中更改web资源并不会在服务器上重新部署它,尽管我在所有地方都检查了“Deploy on Save”(war/ear)。 一些可能有用的信息: 我没有从NetBeans生成pom.xml。这些项目以前是ant project,我通过模仿netbeans从ear/ejb/war设置生成的内容进行迁移。 我有时很难在war文件中进行更改。我需要清理所有项目,停止服务器等。

  • 我试图让CDI在tomcat 9.x中工作。我遵循了以下链接,但openwebbeans容器仍然没有将资源注入servlet https://devlearnings.wordpress.com/2011/05/15/apache-openwebbeans-cdi-from-standalone-to-webapp/https://dzone.com/articles/using-apache-o

  • 文件src/main/webapp/WEB-INF/web.xml包含用于引导CDI的servlet侦听器和BeanManager引用: 通过这些设置,在使用mvn Jetty运行应用程序时,我总是遇到以下错误:run(第一行是最重要的): 应用程序正在运行,但正如异常消息所述:CDI注入在servlet中不可用。 在src/main/resources/log4j.properties中,我增加

  • 我正在尝试使用AWS CDK部署lambda,但它似乎无法正常工作/部署。管道中的“框”为绿色,因此不会返回任何错误。 一切似乎都很好,但是当我手动运行它进行测试时,我收到了下一条消息: 问题是,如果我手动将人工制品下载到我的机器上,并使用上传按钮将其上载,它将正常工作。 我有一个,其中包含,这是我用来创建lambda的堆栈。 然后我有管道,其中一个步骤是构建lambda: 还有更多的步骤,但它们

  • 问题内容: 我正在Linux Ubuntu Natty Narwhal中运行带有Tomcat 7.0.12的Eclipse Helios Service Release 1。 我一直很高兴地重新部署我的Web应用程序,直到它毫无理由地停止工作为止。显示以下异常: 在“ 服务器” 选项卡中,“本地主机上的Tomcat v7.0服务器[已启动,已同步] 我的项目显示为Tomcat v7.0 Serve

  • 主要内容:部署,访问Servlet 没有 main() 方法,不能独立运行,但它可以作为 JavaWeb 应用的一个组件被部署到 Servlet 容器中,由容器来实例化和调用 Servlet 的方法,例如:doGet() 、doPost() 等。 那么,JavaWeb 应用是什么呢?Servlet 是如何部署和访问的呢?本节我们将针对这些问题进行讲解。 JavaWeb 应用 JavaWeb 应用由一组 Servlet