Question

Je voudrais écrire quelques JSON tous les 5 secondes. J'utilise Jackson pour écrire le JSON, mais il semble bloquer mon TimerTask. Si je ne vous écris pas JSON, le TimerTask est exécuté tous les 5 secondes, mais lorsque je tente d'écrire JSON il est bloqué et ne fonctionne qu'une seule fois. Comment puis-je résoudre ce problème?

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();
        }
    }
}

Voici ma décharge de la pile pour le thread Timer:

"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)
Était-ce utile?

La solution

The problem is with your use of System.out, not with Jackson.

Autres conseils

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top