2011-05-01 55 views
2

我想每隔5秒寫一些JSON。我使用傑克遜寫JSON,但它似乎阻止我的TimerTask。如果我不寫JSON,則TimerTask每隔5秒運行一次,但是當我嘗試寫JSON時,它被阻塞並且只運行一次。我怎樣才能解決這個問題?使用Jackson寫入JSON塊我的TimerTask

public class MyTimerTask extends TimerTask { 

    public static void main(String[] args) { 

     Timer timer = new Timer(); 

     // execute MyTimerTask every 5th second 
     timer.scheduleAtFixedRate(new MyTimerTask(), 1000L, 5 * 1000L); 
    } 

    @Override 
    public void run() { 
     System.out.println("timertask"); 

     // Write JSON to System.out 
     ObjectMapper mapper = new ObjectMapper(); 
     try { 
      mapper.writeValue(System.out, "Hello"); 
     } catch (Exception e1) { 
      e1.printStackTrace(); 
     } 
    } 
} 

這裏是我的定時器線程堆棧轉儲:

"Timer-0" prio=6 tid=0x02488000 nid=0x10ec in Object.wait() [0x04a6f000] 
    java.lang.Thread.State: TIMED_WAITING (on object monitor) 
     at java.lang.Object.wait(Native Method) 
     - waiting on <0x24577fa8> (a java.util.TaskQueue) 
     at java.util.TimerThread.mainLoop(Unknown Source) 
     - locked <0x24577fa8> (a java.util.TaskQueue) 
     at java.util.TimerThread.run(Unknown Source) 

回答

1

問題在於你使用System.out而不是Jackson。

+0

你有解決方案嗎? – Jonas 2011-05-04 18:55:31

+0

首先序列化爲一個字符串,然後打印出結果(可能帶有尾隨換行符) – StaxMan 2011-05-13 21:28:35

0

是阻塞,或只是扔你沒有捕獲異常,從而有效地消除你的任務是什麼?

作爲一方不是「printStackTrace()」幾乎從來不是一種有用的異常處理形式。要麼不抓住例外,要麼意味着記錄。只是調用「printStackTrace()」是要求隱藏錯誤。

如果你的任務真的被阻塞,那麼下一步是獲得你的掛起程序的堆棧轉儲。這應該告訴你是什麼導致代碼被阻止。

+0

我更新了我的代碼,使用'Exception'來代替它們。 – Jonas 2011-05-01 21:16:55

+0

更新了我的答案,以指示下一步,獲取堆棧轉儲。 – jtahlborn 2011-05-01 22:26:57

+0

我加了一個「堆棧轉儲」,但我並不是很瞭解它。無論如何,我希望它有幫助。 – Jonas 2011-05-01 23:06:25