• 绍兴印染布质量比对成果发布 部分指标国际领先 2019-07-11
  • 陕西守艺人丨一场大火后,她带领600羌州绣娘从头开始 2019-07-11
  • 今日武汉中考考生可看考点考场 进行英语听力试听 2019-07-08
  • 中方坚决捍卫国家利益和人民利益 2019-07-08
  • "创造101"杨超越引争议 表演业余人气高别光怨选手 2019-07-07
  • 风水神话的回帖除了对我的攻击以外吗,别的还有什么吗? 2019-06-21
  • 通过学历教育、职业培训、在线学习等渠道 新区居民将享天津职教资源 2019-06-17
  • 千名新疆学子的梦想在鄱湖之滨启航 2019-06-13
  • 晋冀鲁豫人民日报印刷厂的组建与迁徙 2019-06-01
  • 高清图集:习近平在山东考察 2019-05-28
  • 让海淀城市“名片”更闪亮 2019-05-28
  • 轻生活,做不一样的自己 2019-05-27
  • 【理上网来·辉煌十九大】德国北威州经济部长:十九大报告表明中国有能力为世界做出更多贡献 2019-05-27
  • 端午出行怕拥堵 别慌,这里有一份出行指南 2019-05-24
  • 空军飞行学员展开高强度实战打靶 消耗千余枚弹药 2019-05-24
  • 
      The Apache Tomcat Servlet/JSP Container

    8人十三水源码:Apache Tomcat 7

    Version 7.0.68, Feb 8 2016
    Apache Logo

    qq游戏里有十三水这个游戏吗 www.tdgb.net Links

    User Guide

    Reference

    Apache Tomcat Development

    Advanced IO and Tomcat

    Table of Contents
    Introduction

    With usage of APR or NIO APIs as the basis of its connectors, Tomcat is able to provide a number of extensions over the regular blocking IO as provided with support for the Servlet API.

    IMPORTANT NOTE: Usage of these features requires using the APR or NIO HTTP connectors. The classic java.io HTTP connector and the AJP connectors do not support them.

    Comet support

    Comet support allows a servlet to process IO asynchronously, receiving events when data is available for reading on the connection (rather than always using a blocking read), and writing data back on connections asynchronously (most likely responding to some event raised from some other source).

    CometEvent

    Servlets which implement the org.apache.catalina.comet.CometProcessor interface will have their event method invoked rather than the usual service method, according to the event which occurred. The event object gives access to the usual request and response objects, which may be used in the usual way. The main difference is that those objects remain valid and fully functional at any time between processing of the BEGIN event until processing an END or ERROR event. The following event types exist:

    • EventType.BEGIN: will be called at the beginning of the processing of the connection. It can be used to initialize any relevant fields using the request and response objects. Between the end of the processing of this event, and the beginning of the processing of the end or error events, it is possible to use the response object to write data on the open connection. Note that the response object and dependent OutputStream and Writer are still not synchronized, so when they are accessed by multiple threads, synchronization is mandatory. After processing the initial event, the request is considered to be committed.
    • EventType.READ: This indicates that input data is available, and that one read can be made without blocking. The available and ready methods of the InputStream or Reader may be used to determine if there is a risk of blocking: the servlet should read while data is reported available. When encountering a read error, the servlet should report it by propagating the exception properly. Throwing an exception will cause the error event to be invoked, and the connection will be closed. Alternately, it is also possible to catch any exception, perform clean up on any data structure the servlet may be using, and using the close method of the event. It is not allowed to attempt reading data from the request object outside of the execution of this method.
      On some platforms, like Windows, a client disconnect is indicated by a READ event. Reading from the stream may result in -1, an IOException or an EOFException. Make sure you properly handle all these three cases. If you don't catch the IOException, Tomcat will instantly invoke your event chain with an ERROR as it catches the error for you, and you will be notified of the error at that time.
    • EventType.END: End may be called to end the processing of the request. Fields that have been initialized in the begin method should be reset. After this event has been processed, the request and response objects, as well as all their dependent objects will be recycled and used to process other requests. End will also be called when data is available and the end of file is reached on the request input (this usually indicates the client has pipelined a request).
    • EventType.ERROR: Error will be called by the container in the case where an IO exception or a similar unrecoverable error occurs on the connection. Fields that have been initialized in the begin method should be reset. After this event has been processed, the request and response objects, as well as all their dependent objects will be recycled and used to process other requests.

    There are some event subtypes which allow finer processing of events (note: some of these events require usage of the org.apache.catalina.valves.CometConnectionManagerValve valve):

    • EventSubType.TIMEOUT: The connection timed out (sub type of ERROR); note that this ERROR type is not fatal, and the connection will not be closed unless the servlet uses the close method of the event.
    • EventSubType.CLIENT_DISCONNECT: The client connection was closed (sub type of ERROR).
    • EventSubType.IOEXCEPTION: An IO exception occurred, such as invalid content, for example, an invalid chunk block (sub type of ERROR).
    • EventSubType.WEBAPP_RELOAD: The web application is being reloaded (sub type of END).
    • EventSubType.SESSION_END: The servlet ended the session (sub type of END).

    As described above, the typical lifecycle of a Comet request will consist in a series of events such as: BEGIN -> READ -> READ -> READ -> ERROR/TIMEOUT. At any time, the servlet may end processing of the request by using the close method of the event object.

    CometFilter

    Similar to regular filters, a filter chain is invoked when comet events are processed. These filters should implement the CometFilter interface (which works in the same way as the regular Filter interface), and should be declared and mapped in the deployment descriptor in the same way as a regular filter. The filter chain when processing an event will only include filters which match all the usual mapping rules, and also implement the CometFiler interface.

    Example code

    The following pseudo code servlet implements asynchronous chat functionality using the API described above:

    public class ChatServlet
        extends HttpServlet implements CometProcessor {
    
        protected ArrayList<HttpServletResponse> connections =
            new ArrayList<HttpServletResponse>();
        protected MessageSender messageSender = null;
    
        public void init() throws ServletException {
            messageSender = new MessageSender();
            Thread messageSenderThread =
                new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + "]");
            messageSenderThread.setDaemon(true);
            messageSenderThread.start();
        }
    
        public void destroy() {
            connections.clear();
            messageSender.stop();
            messageSender = null;
        }
    
        /**
         * Process the given Comet event.
         *
         * @param event The Comet event that will be processed
         * @throws IOException
         * @throws ServletException
         */
        public void event(CometEvent event)
            throws IOException, ServletException {
            HttpServletRequest request = event.getHttpServletRequest();
            HttpServletResponse response = event.getHttpServletResponse();
            if (event.getEventType() == CometEvent.EventType.BEGIN) {
                log("Begin for session: " + request.getSession(true).getId());
                PrintWriter writer = response.getWriter();
                writer.println("<!DOCTYPE html>");
                writer.println("<head><title>JSP Chat</title></head><body>");
                writer.flush();
                synchronized(connections) {
                    connections.add(response);
                }
            } else if (event.getEventType() == CometEvent.EventType.ERROR) {
                log("Error for session: " + request.getSession(true).getId());
                synchronized(connections) {
                    connections.remove(response);
                }
                event.close();
            } else if (event.getEventType() == CometEvent.EventType.END) {
                log("End for session: " + request.getSession(true).getId());
                synchronized(connections) {
                    connections.remove(response);
                }
                PrintWriter writer = response.getWriter();
                writer.println("</body></html>");
                event.close();
            } else if (event.getEventType() == CometEvent.EventType.READ) {
                InputStream is = request.getInputStream();
                byte[] buf = new byte[512];
                do {
                    int n = is.read(buf); //can throw an IOException
                    if (n > 0) {
                        log("Read " + n + " bytes: " + new String(buf, 0, n)
                                + " for session: " + request.getSession(true).getId());
                    } else if (n < 0) {
                        error(event, request, response);
                        return;
                    }
                } while (is.available() > 0);
            }
        }
    
        public class MessageSender implements Runnable {
    
            protected boolean running = true;
            protected ArrayList<String> messages = new ArrayList<String>();
    
            public MessageSender() {
            }
    
            public void stop() {
                running = false;
            }
    
            /**
             * Add message for sending.
             */
            public void send(String user, String message) {
                synchronized (messages) {
                    messages.add("[" + user + "]: " + message);
                    messages.notify();
                }
            }
    
            public void run() {
    
                while (running) {
    
                    if (messages.size() == 0) {
                        try {
                            synchronized (messages) {
                                messages.wait();
                            }
                        } catch (InterruptedException e) {
                            // Ignore
                        }
                    }
    
                    synchronized (connections) {
                        String[] pendingMessages = null;
                        synchronized (messages) {
                            pendingMessages = messages.toArray(new String[0]);
                            messages.clear();
                        }
                        // Send any pending message on all the open connections
                        for (int i = 0; i < connections.size(); i++) {
                            try {
                                PrintWriter writer = connections.get(i).getWriter();
                                for (int j = 0; j < pendingMessages.length; j++) {
                                    writer.println(pendingMessages[j] + "<br>");
                                }
                                writer.flush();
                            } catch (IOException e) {
                                log("IOExeption sending message", e);
                            }
                        }
                    }
    
                }
    
            }
    
        }
    
    }
    Comet timeouts

    If you are using the NIO connector, you can set individual timeouts for your different comet connections. To set a timeout, simply set a request attribute like the following code shows:

    CometEvent event.... event.setTimeout(30*1000);

    or

    event.getHttpServletRequest().setAttribute("org.apache.tomcat.comet.timeout", new Integer(30 * 1000));

    This sets the timeout to 30 seconds. Important note: in order to set this timeout, it has to be done on the BEGIN event. The default value is soTimeout

    If you are using the APR connector, all Comet connections will have the same timeout value. It is soTimeout*50

    Asynchronous writes

    When APR or NIO is enabled, Tomcat supports using sendfile to send large static files. These writes, as soon as the system load increases, will be performed asynchronously in the most efficient way. Instead of sending a large response using blocking writes, it is possible to write content to a static file, and write it using a sendfile code. A caching valve could take advantage of this to cache the response data in a file rather than store it in memory. Sendfile support is available if the request attribute org.apache.tomcat.sendfile.support is set to Boolean.TRUE.

    Any servlet can instruct Tomcat to perform a sendfile call by setting the appropriate request attributes. It is also necessary to correctly set the content length for the response. When using sendfile, it is best to ensure that neither the request or response have been wrapped, since as the response body will be sent later by the connector itself, it cannot be filtered. Other than setting the 3 needed request attributes, the servlet should not send any response data, but it may use any method which will result in modifying the response header (like setting cookies).

    • org.apache.tomcat.sendfile.filename: Canonical filename of the file which will be sent as a String
    • org.apache.tomcat.sendfile.start: Start offset as a Long
    • org.apache.tomcat.sendfile.end: End offset as a Long
    Comments

    Notice: This comments section collects your suggestions on improving documentation for Apache Tomcat.

    If you have trouble and need help, read Find Help page and ask your question on the tomcat-users qq游戏里有十三水这个游戏吗. Do not ask such questions here. This is not a Q&A section.

    The Apache Comments System is explained here. Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.


    Copyright © 1999-2016, Apache Software Foundation
  • 绍兴印染布质量比对成果发布 部分指标国际领先 2019-07-11
  • 陕西守艺人丨一场大火后,她带领600羌州绣娘从头开始 2019-07-11
  • 今日武汉中考考生可看考点考场 进行英语听力试听 2019-07-08
  • 中方坚决捍卫国家利益和人民利益 2019-07-08
  • "创造101"杨超越引争议 表演业余人气高别光怨选手 2019-07-07
  • 风水神话的回帖除了对我的攻击以外吗,别的还有什么吗? 2019-06-21
  • 通过学历教育、职业培训、在线学习等渠道 新区居民将享天津职教资源 2019-06-17
  • 千名新疆学子的梦想在鄱湖之滨启航 2019-06-13
  • 晋冀鲁豫人民日报印刷厂的组建与迁徙 2019-06-01
  • 高清图集:习近平在山东考察 2019-05-28
  • 让海淀城市“名片”更闪亮 2019-05-28
  • 轻生活,做不一样的自己 2019-05-27
  • 【理上网来·辉煌十九大】德国北威州经济部长:十九大报告表明中国有能力为世界做出更多贡献 2019-05-27
  • 端午出行怕拥堵 别慌,这里有一份出行指南 2019-05-24
  • 空军飞行学员展开高强度实战打靶 消耗千余枚弹药 2019-05-24
  • 广西快乐双彩开奖走势图 北京赛车pk10稳定杀一码 数码麻将机调节 2019257期3d开奖号码 中国福彩开奖查询北京十一选五 一波中特诗082期 全天计划和值 让分胜负 新疆25选7 澳洲有没有澳洲幸运10 平特二连尾赔多少 欢乐生肖官网 广东十一选五历史 平码复式三中三公式表 贵州快三网上商城