Writing JSON using Jackson blocks my TimerTask
Question
I would like to write some JSON every 5th second. I'm using Jackson to write the JSON, but it seem to block my TimerTask. If I don't write JSON, the TimerTask is run every 5th second, but when I try to write JSON it's blocked and only run once. How can I fix this?
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();
}
}
}
Here is my stack dump for the Timer thread:
"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)
Solution
The problem is with your use of System.out, not with Jackson.
OTHER TIPS
is it blocked, or is it just throwing an exception which you aren't catching, which effectively cancels your task?
as a side not "printStackTrace()" is almost never a useful form of exception handling. either don't catch the exception or log it meaningfully. just calling "printStackTrace()" is asking to hide bugs.
if your task really is blocked, then the next step is to get a stack dump of your hung program. this should show you what is causing the code to block.