2016-04-06 3 views
4

Привет всем Я пытаюсь отправить сообщение Stomp Endpoints, но я не получаю any.I я использую загрузку пружинный с топают следующие мои классыSimpMessagingTemplate не отправляет сообщения в весеннем ботинке

@Controller 
public class GreetingController { 

    @MessageMapping("/hello") 
    @SendTo("/topic/greetings") 
    public Greeting greeting(HelloMessage message) throws Exception { 
    System.out.println(message.getName()); 
    Thread.sleep(13000); // simulated delay 
    return new Greeting("Hello, " + message.getName() + "!"); 
    } 

} 

@Controller             
public class Testcont { 

    @Autowired 
    private SimpMessagingTemplate messageSender; 

    @RequestMapping(value="/Users/get",method=RequestMethod.POST) 
    @ResponseBody 
    public String getUser(@RequestParam(value = "userId") String userId, @RequestParam(value = "password") String password, @RequestParam(value="port") String port, HttpServletRequest request) { 
    HelloMessage mess=new HelloMessage(); 
    mess.setName(userId); 
    messageSender.convertAndSend("/app/hello",mess); 
    return "Success"; 

} 

и моя конфигурация для WebSocket

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry config) { 
     config.enableSimpleBroker("/topic"); 
     config.setApplicationDestinationPrefixes("/app"); 
    } 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/hello").withSockJS(); 
    } 

} 

У меня нет ошибок в консолях. Этот код отлично работает с веб-браузерами.

+0

Как вы достигли этого Захида? m застрял на той же проблеме, и я не мог понять ответ –

ответ

4

SimpMessagingTemplate боб именно для той части Брокера (AbstractMessageBrokerConfiguration):

@Bean 
public SimpMessagingTemplate brokerMessagingTemplate() { 
    SimpMessagingTemplate template = new SimpMessagingTemplate(brokerChannel()); 
    String prefix = getBrokerRegistry().getUserDestinationPrefix(); 
    if (prefix != null) { 
     template.setUserDestinationPrefix(prefix); 
    } 

Поскольку вы отправляете сообщение не брокер назначение (/app/ в вашем случае), такое сообщение просто игнорируются AbstractBrokerMessageHandler.checkDestinationPrefix(destination).

Если вы хотите, чтобы справиться с этим внутренним сообщением с помощью тех же @MessageMapping, вы должны использовать clientInboundChannel непосредственно, который поставляется в SimpAnnotationMethodMessageHandler:

@Bean 
public SimpAnnotationMethodMessageHandler simpAnnotationMethodMessageHandler() { 
    SimpAnnotationMethodMessageHandler handler = createAnnotationMethodMessageHandler(); 
    handler.setDestinationPrefixes(getBrokerRegistry().getApplicationDestinationPrefixes()); 

Я думаю, вы можете создать свой собственный SimpMessagingTemplate экземпляр для clientInboundChannel, аналогично тому, что brokerMessagingTemplate bean. И с тобой все будет хорошо.

+0

Спасибо, я думаю, теперь я знаю, где я делаю ошибку. –

+0

Артем Я не понял ур ответ, может ли мне руководствоваться? –

+0

Не уверен, откуда вы направляете, но я думаю, что было бы лучше начать с Справочного руководства: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html , Все остальное должно быть рассмотрено в отдельном потоке SO. –