JBoss 6.4: Возможно ли, чтобы мой класс сервера websocket находился вне web-app.war? - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь заменить Java-апплет, на котором запущен сервер сокетов, веб-сокетом, потому что я хочу избежать того, что все клиенты требуют установки Java JRE.

Веб-приложение работает вJBoss 6.4 и сервер веб-сокетов работают, когда класс / jar находится в web-app.war / WEB-INF / lib

Проблема в том, что яхочу иметь класс сервера websocket вне web-app.war, чтобы иметь возможность доступа к моим основным классам, расположенным в папке lib вне web-app.war.Ухо выглядит так:

  • app.ear
    • lib
    • META-INF
    • web-app.war
      • WEB-INF
      • ...

Это то, что я пробовал после setup изwebsocket в JBoss 6.4

1.Пробный доступ инициировал класс за пределами web-app.war

Я пытался получить доступ к своему классу в lib за пределами web-app.war, но он говорит, что класс был инициирован другим загрузчиком классов.

2.Добавил пользовательский ServerApplicationConfig

Добавил пользовательский ServerApplicationConfig в web-app.war / WEB-INF / lib, а затем указал мой сервер веб-сокетов, который находится внутри фляги в папке lib за пределами веб-сайта.app.war.Я не понимаю, почему это не работает?Я могу хранить свои сервлеты в папке lib.

WebSocketConfig.java (находится в app.ear / web-app.war / WEB-INF / lib /)

import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;
import java.util.HashSet;
import java.util.Set;

public class WebSocketConfig implements ServerApplicationConfig {

    @Override
    public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> set) {
        Set<ServerEndpointConfig> configs = new HashSet();
        return configs;
    }

    @Override
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> set) {
        try {
            set.add(Class.forName("test.websocket.core.WebSocketHello"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return set;
    }
}

WebSocketHello.Java (находится в app.ear / lib /)

import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/websocket/hello")
public class WebSocketHello {

    @OnMessage
    public String sayHello(String name) {
        System.out.println("Say hello to '" + name + "'");
        return ("Hello" + name);
    }

    @OnOpen
    public void helloOnOpen(Session session) {
        System.out.println("WebSocket opened: " + session.getId());
    }

    @OnClose
    public void helloOnClose(CloseReason reason) {
        System.out.println("Closing a WebSocket due to " + reason.getReasonPhrase());
    }
}

Затем я получаю следующую ошибку:

15:24:55,086 ERROR [org.jboss.web] (ServerService Thread Pool -- 83) JBAS018202: Error calling onStartup for servlet container initializer: org.apache.tomcat.websocket.server.WsSci: javax.servlet.ServletException: javax.websocket.DeploymentException: JBWEB008584: Cannot deploy POJO class [test.websocket.core.WebSocketHello] as it is not annotated with @ServerEndpoint
    at org.apache.tomcat.websocket.server.WsSci.onStartup(WsSci.java:143) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
    at org.jboss.as.web.deployment.JBossContextConfig.lifecycleEvent(JBossContextConfig.java:187) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:115) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3775) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
    at org.jboss.as.web.deployment.WebDeploymentService.doStart(WebDeploymentService.java:163) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
    at org.jboss.as.web.deployment.WebDeploymentService.access$000(WebDeploymentService.java:61) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
    at org.jboss.as.web.deployment.WebDeploymentService$1.run(WebDeploymentService.java:96) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [rt.jar:1.8.0_211]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_211]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [rt.jar:1.8.0_211]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [rt.jar:1.8.0_211]
    at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_211]
    at org.jboss.threads.JBossThread.run(JBossThread.java:122)
Caused by: javax.websocket.DeploymentException: JBWEB008584: Cannot deploy POJO class [test.websocket.core.WebSocketHello] as it is not annotated with @ServerEndpoint
    at org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:241) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
    at org.apache.tomcat.websocket.server.WsSci.onStartup(WsSci.java:140) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
    ... 12 more

3.Попытался опубликовать конечную точку веб-сокета через WebListener

WebAppListener.java

import javax.servlet.ServletContextEvent;
import javax.websocket.server.ServerContainer;
import javax.websocket.server.ServerEndpointConfig;

public class WebAppListener implements javax.servlet.ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServerEndpointConfig serverEndpointConfig = ServerEndpointConfig.Builder.
                create(endpointClass, endpointPath).build();

        try {
            ServerContainer serverContainer = (ServerContainer) sce.getServletContext().getAttribute(
                    "javax.websocket.server.ServerContainer");
            serverContainer.addEndpoint(serverEndpointConfig);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

Но получило следующее сообщение об ошибке:

Cannot cast 'org.apache.tomcat.websocket.server.WsServerContainer' to 'javax.websocket.server.ServerContainer'`
...