2014-11-19 2 views
1

Я только что выполнил инструкцию от пружины, чтобы отправить ответ от конкретного пользователя, а не широковещательное сообщение вместо этого. Но в конце ответное сообщение не может быть отправлено обратно.Почему Spring SendToUser не работает

это мой JS код:

var stompClient = null; 
function setConnected(connected) { 
    document.getElementById('connect').disabled = connected; 
    document.getElementById('disconnect').disabled = !connected; 
    document.getElementById('conversationDiv').style.visibility = 
      connected ? 'visible': 'hidden'; 
    document.getElementById('response').innerHTML = ''; 
} 
function connect() { 
    var socket = new SockJS('reqsample'); 
    stompClient = Stomp.over(socket); 
    stompClient.connect({}, function(frame) { 
     setConnected(true); 
     console.log('Connected: ' + frame); 
     stompClient.subscribe('user/queue/resp', function(resp) { 
      var body = JSON.parse(resp.body); 
      showResp('cmid:' + body.cmid + ',reqName:' + body.reqName 
        + ',custNo:' + body.custNo + ',qty:' + body.quantity); 
     }); 
     stompClient.subscribe('user/queue/errors', function(resp) { 
      var body = JSON.parse(resp.body); 
      showResp(body); 
     }); 
    }); 
} 
function disconnect() { 
    stompClient.disconnect(); 
    setConnected(false); 
    console.log("Disconnected"); 
} 
function sendName() { 
    var name = document.getElementById('name').value; 
    stompClient.send("/app/req", {}, JSON.stringify({ 
     'name' : name 
    })); 
} 

Это контроллер:

@Controller 
public class MessageController { 
    @MessageMapping("/req") 
    @SendToUser("/queue/resp") 
    public RespMessage greeting(ReqMessage message, Principal pc) 
     throws Exception { 
    System.out.println("---- received message: " + message == null ? "NULL" 
      : message.getName()); 
    System.out.println("---- received user info: " + pc.getName()); 
    RespMessage rm = new RespMessage(); 
    rm.setCmid("CM_01"); 
    rm.setCustNo("Cust_02"); 
    rm.setQuantity("1000"); 
    rm.setReqName(message.getName()); 
    return rm; 

    } 

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

    } 

Это конфигурация пружины:

<context:component-scan base-package="wx.poc7" /> 
<mvc:annotation-driven /> 
<bean 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 
<mvc:resources mapping="/js/**" location="/js/" /> 
<websocket:message-broker 
    application-destination-prefix="/app" user-destination-prefix="/user"> 
    <websocket:stomp-endpoint path="reqsample"> 
     <websocket:sockjs /> 
    </websocket:stomp-endpoint> 
    <websocket:simple-broker prefix="/queue, /topic" /> 
</websocket:message-broker> 

пожалуйста помощь. thx заранее.

Я попытался использовать @SendToUser, @ SendToUser («/ queue/resp») и SimpMessagingTemplate, а также полностью не может ответить на сообщение в браузере.

ответ

0

Ваша конфигурация WebSocket выглядит хорошо, но я думаю, что вопрос с правильным connect URL:

new SockJS('reqsample') 

Убедитесь, что этот URL действителен. Я вижу, что вы используете то же самое для stomp-endpoint path="reqsample". Но не забывайте, что есть картинка DispatcherServlet в web.xml.

Попробуйте использовать код full от конструктора SockJS, включая хост и порт. Как это:

http://localhost:8080/reqsample 

Если DispatcherServlet отображается в /.

Когда вы определяете правильный URL-адрес своей конечной точки STOMP, вы можете играть с относительным путем от этого JSP.

+0

ТНХ много, я попробую –

5

Префикс целевого назначения - /user, но, похоже, вам не хватает / в пункте назначения вашей подписки. Измените user/queue/resp на номер /user/queue/resp, чтобы получать сообщения на вашей стороне клиента.

+0

ой, боже мой! он работает только для добавления/для префикса пользователя, тогда/пользователь работает. thx много, спасите меня много времени –

0

Когда в Javascript вы подписаться на канал:

stompClient.subscribe('user/queue/errors', function(resp) { 
      var body = JSON.parse(resp.body); 
      showResp(body); 
     }); 

правильный путь 'пользователь /' + имя пользователя + 'очереди/ошибки

взгляд эта тема тоже: Sending message to specific user on Spring Websocket

 Смежные вопросы

  • Нет связанных вопросов^_^