2016-06-01 5 views
-1

У меня есть два таймера, что график две задачи:Java два таймера

public ReWrite() throws InterruptedException { 
    timer = new Timer(); 
    TimerTask CSVTask = new TimerTask() { 
     @Override 
     public void run() { 
      readFromCSV(); 
     } 
    }; 
    TimerTask mailTask = new TimerTask() { 
     @Override 
     public void run() { 
      checkStatus(); 
     } 
    }; 
    timer.schedule (CSVTask, 0l, 1000*60*60); 
    timer.schedule (mailTask, 60000l, 1000*60*10); 
} 

readFromvCSV()

  1. Нахождение всех файлов CSV в папке, кроме последнего
  2. Чтение всех данных от них и напишите в CassandraDB (или, если не можете - до последнего файла в папке)
  3. Удалить все файлы CSV (кроме последнего)

checkStatus()

  1. Поиск всех файлов CSV в папке и возьмите размер файла один последний
  2. Если файл размером> 1 Мб, отправка по электронной почте

Он работает вначале, хотя данных было несколько строк, но когда речь идет о тысячах - я получил это сообщение об ошибке:

Exception in thread "Timer-0" java.lang.ArrayIndexOutOfBoundsException: 1 
at handler.emergency.ReWrite.WriteToCassandra(ReWrite.java:197) 
at handler.emergency.ReWrite.lambda$ReadFromCSV$1(ReWrite.java:137) 
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) 
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) 
at java.util.Iterator.forEachRemaining(Iterator.java:116) 
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) 
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) 
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) 
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) 
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) 
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) 
at handler.emergency.ReWrite.ReadFromCSV(ReWrite.java:129) 
at handler.emergency.ReWrite.access$000(ReWrite.java:21) 
at handler.emergency.ReWrite$1.run(ReWrite.java:56) 
at java.util.TimerThread.mainLoop(Timer.java:555) 
at java.util.TimerThread.run(Timer.java:505) 

Возможно, я получил эту ошибку, обратившись к файлу с двумя задачами одновременно?

Возможно, я могу просто написать два разных класса с их собственными таймерами и задачами: один с функциями чтения/записи и второй для чтения \ электронной почты, но мне интересно решить проблему таким образом с помощью двух таймеров/задач.

Что мне нужно для этого? Еще одна асинхронная тема?

Извините за все ошибки, мой первый пост

ОБНОВЛЕНО: сообщение для невнимательности, извините. Ошибка связана с неправильными данными CSV.

+0

Он сообщает вам, что ошибка находится на 'at com.academmedia.stat.handler.emergency.ReWrite.WriteToCassandra (ReWrite.java:197)' –

+0

Да, извините, просто не видел эту строку трассировки. Кажется, иногда мозг и глаза нуждаются в отдыхе * _ * – ANTVirGEO

ответ

0

Кажется, что ваша WriteToCassandra (метод?) Вызывает проблему. Без полного кода мы не можем вам помочь. Также следует учитывать блокировку файла при чтении/записи, но, честно говоря, я не делал много файлов ввода-вывода, чтобы другие могли дать вам лучший совет.

+0

Правильно, ошибка была в методе записи - просто ошибка в InputData - CSV был из какого-то другого проекта .. – ANTVirGEO

0

Из трассировки стека кажется, что код пытается перебирать коллекцию. Если элементы из коллекции удаляются во время итерации, то итерация может завершиться неудачей, если не будут приняты надлежащие средства. Возможно, это происходит в вашем случае.

Вышеупомянутый сценарий кажется правдоподобным, поскольку вы указываете передачу строк источника в один из двух возможных мест назначения (Cassandra или файл), что означает, что вы, вероятно, удалите уже перенесенные строки из источника.

Это еще не объясняет, почему ошибка видна только с большими файлами. Представленная вами информация и абзац кода слишком далеки от источника ошибки.

+0

С помощью Iterator i = collection.iterator() можно создать цикл while (iterator.hasNext()), в котором вы можете вызвать iterator.next(). Затем вы можете вызвать iterator.remove() внутри цикла, чтобы удалить элемент из коллекции, продолжая перебирать его. :) – xxtesaxx

+0

@xxtesaxx Отредактировано мое сообщение, чтобы добавить комментарий. Я имел в виду, что удаление во время итерации завершается неудачно, если не выполняется ** правильно **, поскольку здесь может указывать трассировка стека. Да, вы правы, что это вообще возможно, нужно только заботиться. –

Смежные вопросы