Java后台框架篇--spring websocket 和stomp实现消息功能

实现一个消息驱动pojo

public class MarcHandler extends AbstractWebSocketHandler{
    private Logger LOGGER = LoggerFactory.getLogger(MarcHandler.class);

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
       LOGGER.info("received Message :"+ message.getPayload());
        Thread.sleep(2000);
        session.sendMessage(new TextMessage("Polo!"));
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
       LOGGER.info("session closed!");
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        LOGGER.info("session established!");
    }
}

配置websocket handler 和js demo

原生websocket配置

 
        
        
    
js demo:
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>


    Home
    
    
    
    






PS: 1)如果打开  会报错:
WebSocket connection to 'ws://localhost:8080/japi-rest/marco' failed: Error during WebSocket handshake: Unexpected response code: 200

利用SockJs解决部分浏览器不支持websocket

<websocket:handlers>
    <websocket:mapping path="/marco" handler="marcHandler"/>
    <websocket:sockjs/>
websocket:handlers>

JS Demo:
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>


    Home
    
    
    
    






使用STOMP 消息

如果直接用websocket 编写web应用 类似与直接使用tcp套接字, stomp 相当于基于websocket之上的一个高层级的线路协议),
 xml配置:

    
        
        
            
        
         
    
    

编写一个消息处理controller:
@Controller
public class MarcoController {
private final static Logger logger = LoggerFactory.getLogger(MarcoController.class);

    @MessageMapping("/marco")
    public Shout handleShout(Shout incoming) {
        logger.info("Received message: " + incoming.getMessage());

        try { Thread.sleep(2000); } catch (InterruptedException e) {}

        Shout outgoing = new Shout();
        outgoing.setMessage("Polo!");

        return outgoing;
    }
}
js 编写测试客户端:
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>


    Home
    
    
    
    
    
    
    






PS:
0) stomap 消息道理数据流程图:
Java后台框架篇--spring websocket 和stomp实现消息功能_第1张图片
1)
 这个配置终端 表明底层的websocket url

2) application-destination-prefix="/app" 是 controller处理的path 前缀
3)   配置了两个代理的目的地
4)  @MessageMapping("/marco") 这个注解的方法返回的数据写到哪个代理目的地呢?因为没有配置@SendTo 所以默认写到/topic +"/marco" ,见下图调试:Java后台框架篇--spring websocket 和stomp实现消息功能_第2张图片



你可能感兴趣的:(开发--2.后台)