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

📄 request.java

📁 mina是以Java实现的一个开源的网络程序框架
💻 JAVA
字号:
/* *  Licensed to the Apache Software Foundation (ASF) under one *  or more contributor license agreements.  See the NOTICE file *  distributed with this work for additional information *  regarding copyright ownership.  The ASF licenses this file *  to you under the Apache License, Version 2.0 (the *  "License"); you may not use this file except in compliance *  with the License.  You may obtain a copy of the License at * *    http://www.apache.org/licenses/LICENSE-2.0 * *  Unless required by applicable law or agreed to in writing, *  software distributed under the License is distributed on an *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *  KIND, either express or implied.  See the License for the *  specific language governing permissions and limitations *  under the License. * */package org.apache.mina.filter.reqres;import java.util.NoSuchElementException;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ScheduledFuture;import java.util.concurrent.TimeUnit;/** * TODO Add documentation *  * @author The Apache MINA Project (dev@mina.apache.org) * @version $Rev: 663549 $, $Date: 2008-06-05 13:56:55 +0200 (Thu, 05 Jun 2008) $ */public class Request {    private final Object id;    private final Object message;    private final long timeoutMillis;    private volatile Runnable timeoutTask;    private volatile ScheduledFuture<?> timeoutFuture;    private final BlockingQueue<Object> responses;    private volatile boolean endOfResponses;    public Request(Object id, Object message, long timeoutMillis) {        this(id, message, true, timeoutMillis);    }    public Request(Object id, Object message, boolean useResponseQueue,                   long timeoutMillis) {        this(id, message, useResponseQueue, timeoutMillis,                TimeUnit.MILLISECONDS);    }    public Request(Object id, Object message, long timeout, TimeUnit unit) {        this(id, message, true, timeout, unit);    }    public Request(Object id, Object message, boolean useResponseQueue,                   long timeout, TimeUnit unit) {        if (id == null) {            throw new NullPointerException("id");        }        if (message == null) {            throw new NullPointerException("message");        }        if (timeout < 0) {            throw new IllegalArgumentException("timeout: " + timeout                    + " (expected: 0+)");        } else if (timeout == 0) {            timeout = Long.MAX_VALUE;        }        if (unit == null) {            throw new NullPointerException("unit");        }        this.id = id;        this.message = message;        this.responses = useResponseQueue ? new LinkedBlockingQueue<Object>() : null;        this.timeoutMillis = unit.toMillis(timeout);    }    public Object getId() {        return id;    }    public Object getMessage() {        return message;    }    public long getTimeoutMillis() {        return timeoutMillis;    }    public boolean isUseResponseQueue() {        return responses != null;    }    public boolean hasResponse() {        checkUseResponseQueue();        return !responses.isEmpty();    }    public Response awaitResponse() throws RequestTimeoutException,            InterruptedException {        checkUseResponseQueue();        chechEndOfResponses();        return convertToResponse(responses.take());    }    public Response awaitResponse(long timeout, TimeUnit unit)            throws RequestTimeoutException, InterruptedException {        checkUseResponseQueue();        chechEndOfResponses();        return convertToResponse(responses.poll(timeout, unit));    }    private Response convertToResponse(Object o) {        if (o instanceof Response) {            return (Response) o;        }        if (o == null) {            return null;        }        throw (RequestTimeoutException) o;    }    public Response awaitResponseUninterruptibly()            throws RequestTimeoutException {        for (; ;) {            try {                return awaitResponse();            } catch (InterruptedException e) {            }        }    }    private void chechEndOfResponses() {        if (responses != null && endOfResponses && responses.isEmpty()) {            throw new NoSuchElementException(                    "All responses has been retrieved already.");        }    }    private void checkUseResponseQueue() {        if (responses == null) {            throw new UnsupportedOperationException(                    "Response queue is not available; useResponseQueue is false.");        }    }    void signal(Response response) {        signal0(response);        if (response.getType() != ResponseType.PARTIAL) {            endOfResponses = true;        }    }    void signal(RequestTimeoutException e) {        signal0(e);        endOfResponses = true;    }    private void signal0(Object answer) {        if (responses != null) {            responses.add(answer);        }    }    @Override    public int hashCode() {        return getId().hashCode();    }    @Override    public boolean equals(Object o) {        if (o == this) {            return true;        }        if (o == null) {            return false;        }        if (!(o instanceof Request)) {            return false;        }        Request that = (Request) o;        return this.getId().equals(that.getId());    }    @Override    public String toString() {        String timeout = getTimeoutMillis() == Long.MAX_VALUE ? "max"                : String.valueOf(getTimeoutMillis());        return "request: { id=" + getId() + ", timeout=" + timeout                + ", message=" + getMessage() + " }";    }    Runnable getTimeoutTask() {        return timeoutTask;    }    void setTimeoutTask(Runnable timeoutTask) {        this.timeoutTask = timeoutTask;    }    ScheduledFuture<?> getTimeoutFuture() {        return timeoutFuture;    }    void setTimeoutFuture(ScheduledFuture<?> timeoutFuture) {        this.timeoutFuture = timeoutFuture;    }}

⌨️ 快捷键说明

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