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

wildfly 8.2.1+spring mvc+spring-websocket(simple-broker)+sockjs+stomp

拓拔坚
2023-03-14

我对websocket有一个问题,特别是提供spring(4.3.4.Release版本)的SimpMessagingTemplate和simple-broker。我在课堂上发送给用户消息:

@Autowired
SimpMessagingTemplate simpMessagingTemplate;

public void onMessage(final TextMessage message, Session session) throws JMSException {
    ....
    this.simpMessagingTemplate.convertAndSendToUser(
                        userInfo.getIp(), "/queue/resp", message.getText());
}

这是我的websocket配置:

    <websocket:message-broker application-destination-prefix="/app" user-destination-prefix="/user">
        <websocket:stomp-endpoint path="/workplace">
            <websocket:handshake-interceptors>
                <bean class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor"/>
            </websocket:handshake-interceptors>
            <websocket:sockjs/>
        </websocket:stomp-endpoint>
        <websocket:simple-broker prefix="/topic, /queue, /user"/>
    </websocket:message-broker>
<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
</servlet>

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

@Controller公共类UserController扩展TextWebSocketHandler{

@MessageMapping("/req")
@SendToUser(destinations = "/queue/resp")
public String greeting(String greeting)
        throws Exception {
    System.out.println("greeeeeeeeeeeeeeeeeeeeeeeeeeeeeting: " + greeting);
    return "{ \"date\": "+ new Date().getTime() + ", \"message\": " + greeting + "}";
}

@MessageExceptionHandler
@SendToUser("/queue/errors")
public String handleException(Exception ex) {
    ex.printStackTrace();
    System.out.println(ex);
    return ex.getMessage();
}

}

和我在客户端上的js代码

    <script>
var service = {},  socket = {
client: null,
stomp: null
};

service.userIpAddress = 'someIpAddress';
service.RECONNECT_TIMEOUT = 25000;
service.SOCKET_URL = 'http://localhost:8080/examinee_workplace/rest/workplace/';


service.send = function(message) {
console.info('try send message = ', message);
var id = Math.floor(Math.random() * 1000000);
socket.stomp.send("/app/req", {
priority: 9
}, JSON.stringify({
message: message,
id: id
}));
};

var startListener = function() {
console.info('subscribe');
socket.stomp.subscribe('/user/' + service.userIpAddress + '/queue/resp', function(resp) {
console.warn('resp = ', resp);
});
socket.stomp.subscribe('/user/' + service.userIpAddress + '/queue/errors', function(resp) {
var body = JSON.parse(resp.body);
console.warn('error body = ', body);
});
};

var reconnect = function() {
console.info('reconnect. this.RECONNECT_TIMEOUT = ', this.RECONNECT_TIMEOUT);
setTimeout(service.initialize,1000);
};

service.initialize = function() {
socket.client = new SockJS(service.SOCKET_URL);
socket.stomp = Stomp.over(socket.client);
socket.stomp.connect({}, startListener);
socket.stomp.onclose = reconnect;
};

service.initialize();

共有1个答案

皇甫心思
2023-03-14

我只是用JavaConfig替换Spring XML配置。我在这里找到了答案:使用sockjs的socket不能与spring4 WebSocket连接

 类似资料:
  • 我们正在将SpringWebSockets集成到我们的应用程序中,我运行了HelloWorld示例,令人惊讶的是,spring为我们连接了一切,以便将服务器端通知推送到客户端。 不过,我有一些简单的问题 1) 队列是如何创建的?我使用的是ActiveMQ,队列名称与我在目的地中指定的不同(例如,像greetings-user3n9\u jn3i)。 2)目标名称是否不同于队列? 3) 我正在使用A

  • 从。build/dist/bundle/programs/web.browser中的构建文件中 以下websocket请求将保持挂起状态为101 我没有在流星上写任何代码来运行它到https,我试图通过Nginx处理。添加ssl证书后,从angular尝试通过而不是连接到meteor 请在下面找到我的nginx文件。 任何线索都将不胜感激。

  • 问题内容: 有没有一种方法可以将WebSocket与SockJS客户端和Spring 4服务器一起使用,而不能与STOMP一起使用? 基于Spring网站上的本教程,我知道如何使用Stomp和Spring 4设置基于WebSocket的应用程序。在客户端,我们有: 在服务器端,控制器中包含以下内容: 现在,我了解可以确保如果将消息发送到目的地,则将调用该方法。并且由于已订阅,因此会将邮件发送回。

  • 我正在使用Spring webSocket(STOMP作为子协议)和Sockjs开发一个消息应用程序。 我应该提供支持在消息中发送文件。 根据这张票证,sockjs不支持二进制数据,但STOMP支持。 我知道我们可以将图像转换为base64并通过stomp发送,但我认为这不是最佳做法,因为转换和开销很大。我还必须保存消息,所以要在服务器上再次保存这个base64编码的文件,我必须对它们进行解码。

  • 如果我使用的是“简单代理”,那么对于spring的Websocket+SockJS,/topic、/queue等之间有什么区别呢?例如。这里在spring Websocket上向特定用户发送消息说:当您客户端订阅以/user/开头的通道时,例如:/user/queue/reply,您的服务器实例将订阅一个名为queue/reply-user的队列[session id] 我想以某种清晰的方式理解这

  • 我正在将Spring网络套接字集成到一个网络应用程序中。我想将其用于在 ajax 中花费很长时间的两个调用。根据我的理解,我看到关于我如何处理有不同的设计选择。我正在考虑以下内容,您能否让我知道什么是最佳选择,如果是,为什么 1)一旦用户通过SockJS登录到应用程序,就打开一个套接字连接,并使用该连接来发送消息和订阅我想要拨打的两个电话。我对这个设计的一个疑问是,如果用户关闭浏览器,套接字连接会