如何通过Tomcat运行带有Spark Framework的WebSockets



我从 https://sparktutorials.github.io/2015/11/08/spark-websocket-chat.html 中举了一个例子,并希望将其作为战争部署到Tomcat以在Web服务器上运行它。我找到了几个具有基本请求的示例(例如 get,用于 Ex.),但这种方式不适用于 Web 套接字。

public class Chat implements SparkApplication{
static Map<Session, String> userUsernameMap = new HashMap<>();
static int nextUserNumber = 1; //Used for creating the next username
public static void main(String[] args) {
    new Chat().init();
}
//Sends a message from one user to all users, along with a list of current usernames
public static void broadcastMessage(String sender, String message) {
    userUsernameMap.keySet().stream().filter(Session::isOpen).forEach(session -> {
        try {
            session.getRemote().sendString(String.valueOf(new JSONObject()
                    .put("userMessage", createHtmlMessageFromSender(sender, message))
                    .put("userlist", userUsernameMap.values())
            ));
        } catch (Exception e) {
            e.printStackTrace();
        }
    });
}
//Builds a HTML element with a sender-name, a message, and a timestamp,
private static String createHtmlMessageFromSender(String sender, String message) {
    return article().with(
            b(sender + " says:"),
            p(message),
            span().withClass("timestamp").withText(new SimpleDateFormat("HH:mm:ss").format(new Date()))
    ).render();
}
@Override
public void init() {
    String route = "/chat";
    webSocket(route, ChatWebSocketHandler.class);
}
}

当我运行它时,我得到

org.apache.catalina.core.StandardContext.filterStart Exception 启动过滤器 SparkFilter java.lang.IllegalStateException:WebSocket 仅在嵌入式服务器中受支持

void init()方法中的第 webSocket(route, ChatWebSocketHandler.class); 行。

如果 smth 取决于我的网络.xml(我没有更改它),列表在这里:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>Messenger</display-name>
<filter>
    <filter-name>SparkFilter</filter-name>
    <filter-class>spark.servlet.SparkFilter</filter-class>
    <init-param>
        <param-name>applicationClass</param-name>
        <param-value>com.barbarian.messenger.Chat</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SparkFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

如果我把new SparkFilter();放在那行之前(刚刚尝试过),我得到了

org.apache.catalina.core.StandardContext.filterStart Exception 启动过滤器 SparkFilter java.lang.IllegalStateException:WebSocket 仅在嵌入式服务器中受支持

在同一行。

有人有有效运行它的想法吗?

基于文档(至少是当前文档):

WebSockets 仅适用于嵌入式 Jetty 服务器,并且必须在常规 HTTP 路由之前定义......

http://sparkjava.com/documentation.html#websockets

这就是为什么在示例代码(https://github.com/tipsy/spark-websocket)中.xml web中看不到任何servlet配置的原因,因为嵌入式Jetty容器可以直接在main方法中运行。此外,它还使用 org.eclipse.jetty.websocket.api.* 包进行 websocket 实现。

如果您需要在Tomcat上运行websocket,则可能需要考虑在catalina软件包中使用WebSocketServlet实现。我在这里找到了示例代码(即使我还没有测试过它):https://gist.github.com/chitan/3063774。希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新