超时队列,用于删除未检索的对象



我有线程将一些东西写入套接字,然后开始等待响应。此线程需要在给定时间(例如 100 毫秒)内检索响应。我的想法是创建读取器线程,该线程将从套接字读取并将响应存储在阻塞队列中。第一个线程只是等待读取器完成工作并将对象放入队列。如果读者在一段时间内完成它,一切都可以,如果读者不这样做,我想抛出异常,它也没关系。问题是,当我在 TimeOutException 之后出现时,由于超时而未从队列中获取的对象仍然存在,甚至可能只是准备插入队列。我只想要下一个对象。我应该如何跳过此消息?或者可能有更好的方法来解决这个问题?

此外,连接保持活动状态,因此套接字超时不合适。

我会BlockingQueue子类化以覆盖poll()offer()方法,这些方法只是调用super.poll()super.offer()。它将在提供新项目时添加时间戳,并在轮询时丢弃队列中时间过长的任何项目。像这样:

public class TimedItemBlockingQueue<T> extends ArrayBlockingQueue<TimedItem<T>> {
    private class TimedItem<T> {
        T data;
        long timestamp;
        TimedItem<T>(T data) {
            this.data = data;
            this.timeStamp = <get_tiemstamp>
    }
    T poll() {
        TimedItem<T> item = super.poll();
        if (isValid(item.timestamp)) {
            return item.data;
        }
        /* Plus extra code to handle exceptions and other cases */
    }
    boolean offer(T data) {
        TimedItem<T> item = new TimedItem<T>(data);
        return super.offer(item);
}

您可能需要覆盖所有poll()方法。

在这种情况下,第一个线程只会调用poll(),甚至不知道中间是否有这样的队列或有多少对象已"过期"

最好的方法是让发送方包含时间戳(如果不可能,则由读取器包含时间戳) 当您从队列中收到消息时,您会检查时间戳,如果没有足够的时间,则假设它已超时(或者会超时)

如果需要使其对调用队列的代码透明,则可以创建 Queue 的子类来丢弃旧消息。

相关内容

  • 没有找到相关文章

最新更新