Я пытаюсь заменить Java-апплет, на котором запущен сервер сокетов, веб-сокетом, потому что я хочу избежать того, что все клиенты требуют установки Java JRE.
Веб-приложение работает вJBoss 6.4 и сервер веб-сокетов работают, когда класс / jar находится в web-app.war / WEB-INF / lib
Проблема в том, что яхочу иметь класс сервера websocket вне web-app.war, чтобы иметь возможность доступа к моим основным классам, расположенным в папке lib вне web-app.war.Ухо выглядит так:
Это то, что я пробовал после 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'`