⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keepalivefilter.java

📁 mina是以Java实现的一个开源的网络程序框架
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    /**     * Creates a new instance.     */    public KeepAliveFilter(            KeepAliveMessageFactory messageFactory,            IdleStatus interestedIdleStatus, KeepAliveRequestTimeoutHandler policy,            int keepAliveRequestInterval, int keepAliveRequestTimeout) {        if (messageFactory == null) {            throw new NullPointerException("messageFactory");        }        if (interestedIdleStatus == null) {            throw new NullPointerException("interestedIdleStatus");        }        if (policy == null) {            throw new NullPointerException("policy");        }        this.messageFactory = messageFactory;        this.interestedIdleStatus = interestedIdleStatus;        requestTimeoutHandler = policy;        setRequestInterval(keepAliveRequestInterval);        setRequestTimeout(keepAliveRequestTimeout);    }    public IdleStatus getInterestedIdleStatus() {        return interestedIdleStatus;    }    public KeepAliveRequestTimeoutHandler getRequestTimeoutHandler() {        return requestTimeoutHandler;    }    public void setRequestTimeoutHandler(KeepAliveRequestTimeoutHandler timeoutHandler) {        if (timeoutHandler == null) {            throw new NullPointerException("timeoutHandler");        }        requestTimeoutHandler = timeoutHandler;    }    public int getRequestInterval() {        return requestInterval;    }    public void setRequestInterval(int keepAliveRequestInterval) {        if (keepAliveRequestInterval <= 0) {            throw new IllegalArgumentException(                    "keepAliveRequestInterval must be a positive integer: " +                    keepAliveRequestInterval);        }        requestInterval = keepAliveRequestInterval;    }    public int getRequestTimeout() {        return requestTimeout;    }    public void setRequestTimeout(int keepAliveRequestTimeout) {        if (keepAliveRequestTimeout <= 0) {            throw new IllegalArgumentException(                    "keepAliveRequestTimeout must be a positive integer: " +                    keepAliveRequestTimeout);        }        requestTimeout = keepAliveRequestTimeout;    }    public KeepAliveMessageFactory getMessageFactory() {        return messageFactory;    }    /**     * Returns <tt>true</tt> if and only if this filter forwards     * a {@link IoEventType#SESSION_IDLE} event to the next filter.     * By default, the value of this property is <tt>false</tt>.     */    public boolean isForwardEvent() {        return forwardEvent;    }    /**     * Sets if this filter needs to forward a     * {@link IoEventType#SESSION_IDLE} event to the next filter.     * By default, the value of this property is <tt>false</tt>.     */    public void setForwardEvent(boolean forwardEvent) {        this.forwardEvent = forwardEvent;    }    @Override    public void onPreAdd(IoFilterChain parent, String name,            NextFilter nextFilter) throws Exception {        if (parent.contains(this)) {            throw new IllegalArgumentException(                    "You can't add the same filter instance more than once. " +            "Create another instance and add it.");        }    }    @Override    public void onPostAdd(            IoFilterChain parent, String name, NextFilter nextFilter) throws Exception {        resetStatus(parent.getSession());    }    @Override    public void onPostRemove(            IoFilterChain parent, String name, NextFilter nextFilter) throws Exception {        resetStatus(parent.getSession());    }    @Override    public void messageReceived(            NextFilter nextFilter, IoSession session, Object message) throws Exception {        try {            if (messageFactory.isRequest(session, message)) {                Object pongMessage =                    messageFactory.getResponse(session, message);                if (pongMessage != null) {                    nextFilter.filterWrite(                            session, new DefaultWriteRequest(pongMessage));                }            }            if (messageFactory.isResponse(session, message)) {                resetStatus(session);            }        } finally {            if (!isKeepAliveMessage(session, message)) {                nextFilter.messageReceived(session, message);            }        }    }    @Override    public void messageSent(            NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {        Object message = writeRequest.getMessage();        if (!isKeepAliveMessage(session, message)) {            nextFilter.messageSent(session, writeRequest);        }    }    @Override    public void sessionIdle(            NextFilter nextFilter, IoSession session, IdleStatus status) throws Exception {        if (status == interestedIdleStatus) {            if (!session.containsAttribute(WAITING_FOR_RESPONSE)) {                Object pingMessage = messageFactory.getRequest(session);                if (pingMessage != null) {                    nextFilter.filterWrite(                            session,                            new DefaultWriteRequest(pingMessage));                    // If policy is OFF, there's no need to wait for                    // the response.                    if (getRequestTimeoutHandler() != KeepAliveRequestTimeoutHandler.DEAF_SPEAKER) {                        markStatus(session);                        if (interestedIdleStatus == IdleStatus.BOTH_IDLE) {                            session.setAttribute(IGNORE_READER_IDLE_ONCE);                        }                    } else {                        resetStatus(session);                    }                }            } else {                handlePingTimeout(session);            }        } else if (status == IdleStatus.READER_IDLE) {            if (session.removeAttribute(IGNORE_READER_IDLE_ONCE) == null) {                if (session.containsAttribute(WAITING_FOR_RESPONSE)) {                    handlePingTimeout(session);                }            }        }        if (forwardEvent) {            nextFilter.sessionIdle(session, status);        }    }    private void handlePingTimeout(IoSession session) throws Exception {        resetStatus(session);        KeepAliveRequestTimeoutHandler handler = getRequestTimeoutHandler();        if (handler == KeepAliveRequestTimeoutHandler.DEAF_SPEAKER) {            return;        }        handler.keepAliveRequestTimedOut(this, session);    }    private void markStatus(IoSession session) {        session.getConfig().setIdleTime(interestedIdleStatus, 0);        session.getConfig().setReaderIdleTime(getRequestTimeout());        session.setAttribute(WAITING_FOR_RESPONSE);    }    private void resetStatus(IoSession session) {        session.getConfig().setReaderIdleTime(0);        session.getConfig().setWriterIdleTime(0);        session.getConfig().setIdleTime(                interestedIdleStatus, getRequestInterval());        session.removeAttribute(WAITING_FOR_RESPONSE);    }    private boolean isKeepAliveMessage(IoSession session, Object message) {        return messageFactory.isRequest(session, message) ||        messageFactory.isResponse(session, message);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -