2011-05-01 58 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