TimerTask, как делать циклические запросы к базе данных? - PullRequest
0 голосов
/ 17 октября 2019

У меня есть REST, отправляющий 2 параметра в базу данных, и я хочу иметь timertask, который должен регулярно запрашивать базу данных.

И проблема в том, что TimerTask и его метод run () не принимают никаких параметров, так какдля этого:

например:

отправка 2 строк через TimerTask, получение ответа из базы данных и TimerTask задают один и тот же запрос (с одинаковыми строками в течение 2 минут)

Через Интернет это только простые примеры того, как печатать «Hello» через регулярные промежутки времени (знаю, как это сделать), но я не могу ответить на вопрос, как использовать метод (который отправляет запрос в базу данных) в TimerTask

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Можно попытаться реализовать концепцию «Производитель / Потребитель» для динамической обработки параметров, я думаю.

Думайте, что производитель - это генератор параметров, а потребитель - как TimerTask.

import java.util.TimerTask;
import java.util.Vector;

class Producer extends Thread {
    static final int MAXQUEUE = 5;
    private Vector messages = new Vector();

    @Override
    public void run() {
        try {
            while (true) {
                putMessage();
                sleep(1000);
            }
        } catch (InterruptedException e) {
        }
    }

    private synchronized void putMessage() throws InterruptedException {

        while (messages.size() == MAXQUEUE)
            wait();
        messages.addElement(new java.util.Date().toString());
        notify();
    }

    // Called by Consumer
    public synchronized String getMessage() throws InterruptedException {
        notify();
        while (messages.size() == 0)
            wait();
        String message = (String) messages.firstElement();
        messages.removeElement(message);
        return message;
    }
}

class Consumer extends TimerTask {
    Producer producer;

    Consumer(Producer p) {
        producer = p;
    }

    @Override
    public void run() {
        try {
            while (true) {
                String message = producer.getMessage();
                System.out.println("Got message: " + message);
                Thread.sleep(2000);
            }
        } catch (InterruptedException e) {
        }
    }

    public static void main(String args[]) {
        Producer producer = new Producer();
        producer.start();
        new Consumer(producer).run();
    }
}

Думайте о новой дате как опараметр динамического запроса для передачи потребителю TimerTask

0 голосов
/ 17 октября 2019

Если значения доступны на момент создания задачи таймера:

Timer timer = null;
TimerTask task = null;

    public void initTimer(final String param1, final String param2){
        if(timer == null)
            timer = new Timer();

        // creating an instance of task to be scheduled
        if(task == null)
          task  = new TimerTask() {
            @Override
            public void run() {
                // database call here
                System.out.println("My params "+param1+" and "+param2);
            }
          };

        // scheduling the timer instance
        timer.schedule(task, 1000, 3000);
    }
...