通过超时更新集合并保持可用性

时间:2018-04-13 14:10:04

标签: java scala flink-streaming

是否有Java / Scala集合(List,Array或类似的东西)在给定的超时后自动更新整个集合内容?但有一个功能是更新将在另一个线程中发生,旧数据将在更新期间可用。

我的情况是使用定期更新的集合来丰富Flink流,我从PostgreSQL获取数据。我不需要为每条消息查询数据库。我每N分钟从表中进行一次完整的数据下载(SELECT * FROM table)。我不想暂停更新数据。

1 个答案:

答案 0 :(得分:2)

尤,

我想缓存是您可以使用的最佳解决方案之一。但是,如果您不了解缓存,以下答案将对您有所帮助。

<强>解决方案

您可以使用TimerTask类及时运行特定方法。以下简单示例将为您提供一个想法。

  • ListUpdater(它是一个TimerTask子级)

    import java.util.TimerTask;

    公共类ListUpdater扩展了TimerTask {

      @Override
      public void run() {
    
        // You can write your code to update your list.
        System.out.println("Updating list");
    
      }
    

    }

  • 申请类

    public class Test {      public static void main(String [] args){

        TimerTask task = new ListUpdater();
    
        Timer timer = new Timer();
        timer.schedule(task, 1000,6000);
     }
    

    }

在此示例中,计时器将每6秒打印一次“正在更新列表”消息,第一次执行时延迟1秒。

java中有很多线程安全集合。你可以自由使用其中任何一个。

  • 的ConcurrentLinkedQueue
  • ArrayBlockingQueue
  • LinkedBlockingDeque
  • 的LinkedBlockingQueue
  • 的PriorityBlockingQueue
  • 的SynchronousQueue
  • DelayQueue

或者创建一个全新的线程安全列表:

列出newList = Collections.synchronizedList(new ArrayList());