2016-06-01 35 views
-1

我有兩個定時器,這個時間表兩個任務:Java的兩個定時器

​​

readFromvCSV()

  1. 查找文件夾中的所有CSV文件除了最後一個
  2. 讀取所有數據從它們寫入CassandraDB(或者如果不能 - 到文件夾中的最後一個文件)
  3. 刪除所有的CSV文件(最後一個除外)

的checkStatus()

  1. 查找文件夾中的所有CSV文件,並採取的最後一個
  2. 文件的大小如果文件大小> 1 MB,發送電子郵件

它工作起初,雖然數據是幾行左右,但當涉及到數千 - 我得到了這個錯誤信息:

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) 

也許我通過兩個任務同時訪問文件得到這個錯誤?

可能我可以用自己的計時器和任務編寫兩個不同的類:一個具有讀\寫功能,另一個具有讀\ Email功能,但我很有興趣以兩種定時器/任務的方式解決問題。

我需要什麼?另一個異步線程?

對不起,所有的錯誤,我的第一後

更新:後爲注意力不集中,很抱歉。錯誤來自錯誤的CSV數據。

+0

它告訴你錯誤在'at at com.academmedia.stat.handler.emergency.ReWrite.WriteToCassandra(ReWrite.java:197)' –

+0

是的,抱歉,只是沒有看到那個跟蹤行。這似乎有時腦和眼睛需要休息* _ * – ANTVirGEO

回答

0

似乎你的WriteToCassandra(方法?)是造成這個問題。沒有完整的代碼,我們無法幫助你。還應該考慮在讀/寫文件的同時鎖定文件,但說實話,我沒有做很多文件I/O,所以其他人可能會給你更好的建議

+0

這是正確的,錯誤是在寫入方法 - 只是在InputData中的錯誤 - CSV來自其他項目.. – ANTVirGEO

0

從堆棧跟蹤看來,代碼嘗試迭代集合。如果在迭代過程中刪除集合中的元素,那麼當不採取適當的方法時,迭代可能會失敗。這可能是你的情況。

當您提到將源行轉移到兩個可能的目的地之一(Cassandra或文件)時,上述情況似乎是合理的,這意味着您可能會從源中刪除已傳輸的行。

儘管如此,這還不能解釋,爲什麼錯誤只有在大文件中才可見。您提供的信息和代碼抽象似乎距離錯誤的來源太遠,無法確定。

+0

通過使用迭代器 i = collection.iterator()可以創建一個while(iterator.hasNext())循環,您可以在其中調用iterator.next()。然後,您可以在循環內調用iterator.remove()以從集合中刪除元素,同時繼續迭代它。 :) – xxtesaxx

+0

@xxtesaxx編輯我的文章,以納入您的意見。我的意思是在迭代期間刪除操作失敗,如果沒有完成**正確**,就像堆棧跟蹤可能在這裏提示的那樣。是的,你是對的,它通常是可能的,只是必須小心。 –