cometd源码阅读-长轮询处理消息过程(九)

我们的配置

这个servlet除了完成我们comted的初始化,还是会处理处理长轮询请求

复制代码
<!-- CometD Servlet -->
  <servlet>
    <servlet-name>cometd</servlet-name>
    <servlet-class>org.cometd.annotation.server.AnnotationCometDServlet</servlet-class>
    <!--liqiang todo 600000-->
    <init-param>
      <param-name>maxProcessing</param-name>
      <param-value>600000</param-value>
    </init-param>
    <init-param>
      <param-name>timeout</param-name>
      <param-value>20000</param-value>
    </init-param>
    <init-param>
      <param-name>interval</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>maxInterval</param-name>
      <param-value>10000</param-value>
    </init-param>
    <init-param>
      <param-name>handshakeReconnect</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>maxLazyTimeout</param-name>
      <param-value>5000</param-value>
    </init-param>
    <init-param>
      <param-name>long-polling.multiSessionInterval</param-name>
      <param-value>2000</param-value>
    </init-param>
    <init-param>
      <param-name>services</param-name>
      <param-value>org.cometd.examples.ChatService</param-value>
    </init-param>
    <init-param>
      <param-name>ws.cometdURLMapping</param-name>
      <param-value>/cometd/*</param-value>
    </init-param>
    <!--容器启动时调用init方法初始化 而不是第一次调用时-->
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
复制代码

继承自CometDServlet

public class AnnotationCometDServlet extends CometDServlet 

<1>

org.cometd.server.CometDServlet#service

复制代码
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        if ("OPTIONS".equals(request.getMethod())) {
            serviceOptions(request, response);
            return;
        }

        //<2>根据请求方式获取对应的transport 这里优先获取的是AsyncJSONTransport
        AbstractHttpTransport transport = _bayeux.findHttpTransport(request);
        if (transport == null) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Unknown Bayeux Transport");
        } else {
            //<4>调用transport的handle 其实跟websoket很相似 websoket是websoket消息触发 http相关则是http请求触发
            transport.handle(request, response);
        }
    }
复制代码

<2>

org.cometd.server.BayeuxServerImpl#findHttpTransport

复制代码
  protected AbstractHttpTransport findHttpTransport(HttpServletRequest request) {
        //遍历已激活的transport
        for (String transportName : _allowedTransports) {
            ServerTransport serverTransport = getTransport(transportName);
            //是否是http类型的transport
            if (serverTransport instanceof AbstractHttpTransport) {
                AbstractHttpTransport transport = (AbstractHttpTransport)serverTransport;
                //<3>调用accept 默认有三种可选项 AsyncJSONTransport、JSONPTransport、JSONTransport
                if (transport.accept(request)) {
                    return transport;
                }
            }
        }
        return null;
    }
复制代码

<3>

org.cometd.server.http.AsyncJSONTransport#accept

 @Override
    public boolean accept(HttpServletRequest request) {
        return "POST".equalsIgnoreCase(request.getMethod());
    }

 

org.cometd.server.http.JSONPTransport#accept

    @Override
    public boolean accept(HttpServletRequest request) {
        //是否是返回jspon的格式
        String callbackValue = request.getParameter(getCallbackParameter());
        return "GET".equals(request.getMethod()) && isCallbackValueValid(callbackValue);
    }

org.cometd.server.http.JSONTransport#accept

    @Override
    public boolean accept(HttpServletRequest request) {
        return "POST".equals(request.getMethod());
    }

<4>

后面就不读了,知道大概就行,跟websoket差不多 只是少了主动推的步骤

1.http请求 /meta/handshake 建立连接

2.http请求 /meta/subscribe 订阅渠道

3.http请求 /meta/unsubscribe 取消订阅渠道

4.http请求 /meta/disconnect 取消订阅渠道

5.http请求 /meta/connect 轮询发送心跳消息表示自己活跃,同时拉取自己session队列里面的消息

6.http请求 针对渠道发送消息,放入订阅渠道的所有sesion队列中,但是没有主动推的动作 等meta/connection来主动拉

 

posted @   意犹未尽  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
历史上的今天:
2021-09-14 JVM实践-记录一次jstack分析(十一)
2021-09-14 Thread的状态
点击右上角即可分享
微信分享提示