2016-11-26 2 views
0

Ist es möglich, einen Timer-Thread gleichzeitig in einer Wicket-Anwendung auszuführen? Unten ist Beispielcode, was ich versuche zu tun. Beim Empfang einer Nachricht möchte ich etwas Verzögerung hinzufügen, so dass ich einen Timer laufen lasse, aber in dem Moment, in dem ich den Timer starte, stoppt der Haupt-Thread und für die Dauer, wenn der Timer läuft, erhalte ich keine anderen Nachrichten. Kann der Timer parallel zum Hauptthread ausgeführt werden? Vielen Dank.Einen Timer gleichzeitig in Wicket-Anwendung ausführen

public class Test extends WebPage{ 
    private Queue<String> msgQueue; 
    Test(){ 
     msgQueue = new ConcurrentLinkedQueue<String>(); 
     add(new WebSocketBehavior() {  

     @Override 
     protected void onMessage(WebSocketRequestHandler handler, 
        TextMessage message) { 
      super.onMessage(handler, message); 
      handleMessage(handler,message); 
     } 

    private void handleMessage(WebSocketRequestHandler handler, TextMessage msg){ 
     msgQueue.add(msg.getText()); 
     Timer timer = new Timer(); 
     Application application = getApplication(); 
     timer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       if (!Application.exists()) { 
        ThreadContext.setApplication(application); 
       } 
       System.out.println(getApplication()); 
      } 
     }, 5000); 
    } 
}´ 

Ich erhalte java.io.NotSerializableException Ausnahme wie in unten meldet sich mit ScheduledThreadPoolExecutor zu sehen:

Nov 27, 2016 8:19:10 PM org.apache.wicket.serialize.java.JavaSerializer serialize 
    SEVERE: Error serializing object class Test [object=[Page class = Test, id = 0, render count = 1]] 
    org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream$ObjectCheckException: The object type is not Serializable! 
    A problem occurred while checking object with type: java.util.concurrent.ScheduledThreadPoolExecutor 

     private final java.util.concurrent.ScheduledExecutorService Test.scheduler [class=java.util.concurrent.ScheduledThreadPoolExecutor] <----- field that is causing the problem 
     at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:362) 
     at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:341) 
     at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.checkFields(CheckingObjectOutputStream.java:605) 
     at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:541) 
     at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:341) 
     at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.writeObjectOverride(CheckingObjectOutputStream.java:673) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) 
     at org.apache.wicket.serialize.java.JavaSerializer$SerializationCheckerObjectOutputStream.writeObjectOverride(JavaSerializer.java:267) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) 
     at org.apache.wicket.serialize.java.JavaSerializer.serialize(JavaSerializer.java:78) 
     at org.apache.wicket.pageStore.AbstractPageStore.serializePage(AbstractPageStore.java:133) 
     at org.apache.wicket.pageStore.DefaultPageStore.createSerializedPage(DefaultPageStore.java:281) 
     at org.apache.wicket.pageStore.DefaultPageStore.storePage(DefaultPageStore.java:61) 
     at org.apache.wicket.page.PageStoreManager$PersistentRequestAdapter.storeTouchedPages(PageStoreManager.java:403) 
     at org.apache.wicket.page.RequestAdapter.commitRequest(RequestAdapter.java:193) 
     at org.apache.wicket.page.AbstractPageManager.commitRequest(AbstractPageManager.java:76) 
     at org.apache.wicket.page.PageManagerDecorator.commitRequest(PageManagerDecorator.java:74) 
     at org.apache.wicket.page.PageAccessSynchronizer$2.commitRequest(PageAccessSynchronizer.java:270) 
     at org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor$1.onDetach(AbstractWebSocketProcessor.java:297) 
     at org.apache.wicket.request.cycle.RequestCycleListenerCollection$3.notify(RequestCycleListenerCollection.java:105) 
     at org.apache.wicket.request.cycle.RequestCycleListenerCollection$3.notify(RequestCycleListenerCollection.java:101) 
     at org.apache.wicket.util.listener.ListenerCollection$1.notify(ListenerCollection.java:120) 
     at org.apache.wicket.util.listener.ListenerCollection.reversedNotify(ListenerCollection.java:144) 
     at org.apache.wicket.util.listener.ListenerCollection.reversedNotifyIgnoringExceptions(ListenerCollection.java:113) 
     at org.apache.wicket.request.cycle.RequestCycleListenerCollection.onDetach(RequestCycleListenerCollection.java:100) 
     at org.apache.wicket.request.cycle.RequestCycle.onDetach(RequestCycle.java:649) 
     at org.apache.wicket.request.cycle.RequestCycle.detach(RequestCycle.java:594) 
     at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:297) 
     at org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor.broadcastMessage(AbstractWebSocketProcessor.java:257) 
     at org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor.onConnect(AbstractWebSocketProcessor.java:175) 
     at org.apache.wicket.protocol.ws.javax.JavaxWebSocketProcessor.<init>(JavaxWebSocketProcessor.java:48) 
     at org.apache.wicket.protocol.ws.javax.WicketEndpoint.onOpen(WicketEndpoint.java:58) 
     at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:129) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:629) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 
    Caused by: java.io.NotSerializableException: java.util.concurrent.ScheduledThreadPoolExecutor 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) 
     at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 
     at org.apache.wicket.serialize.java.JavaSerializer$SerializationCheckerObjectOutputStream.writeObjectOverride(JavaSerializer.java:256) 

Antwort

2

TL; DR: Verschieben Sie den Scheduler in YourApplication.java und setzen Sie die API zum Planen von Tasks frei. Es ist sowieso kein Scheduler pro Seite erforderlich.

Für nähere Informationen wenden Sie sich bitte diesen Artikel lesen: Siehe http://wicketinaction.com/2014/07/working-with-background-jobs/

+0

Vielen Dank martin, ich habe den Scheduler Teil zur Anwendung verschoben und es funktioniert gut. :) –

1

Sie ScheduledExecutorService für die (läuft in separaten Thread) Scheduler-Task verwenden können, wie gezeigt, im folgenden mit Inline-Kommentare:

public class Test extends WebPage{ 

    //Initialise ScheduledExecutorService thread pool 
    private final ScheduledExecutorService scheduler = 
       Executors.newScheduledThreadPool(1); 

    private Queue<String> msgQueue; 
     Test(){ 
      msgQueue = new ConcurrentLinkedQueue<String>(); 
      add(new WebSocketBehavior() {  

      @Override 
      protected void onMessage(WebSocketRequestHandler handler, 
         TextMessage message) { 
       super.onMessage(handler, message); 
       handleMessage(handler,message); 
      } 

     private void handleMessage(WebSocketRequestHandler handler, 
                TextMessage msg){ 
      msgQueue.add(msg.getText()); 
      Timer timer = new Timer(); 
      final Application application = getApplication(); 

      //Implement Runnable which runs in sep. Thread 
      Runnable runnable =() -> { 
       if (!Application.exists()) { 
        ThreadContext.setApplication(application); 
       } 
      }; 

      //Start the scheduler Now which runs for every 5 seconds 
      ScheduledFuture<V> timer = scheduler.schedule(runnable, 5000, TimeUnit.SECONDS); 
      //you can check timer.isDone() 
     } 
    } 

    private static void enhancedLoop(int[] numbers) { 
     //add your code 
    } 

können Sie here sucht mehr über ScheduledExecutorService zu verstehen.

+0

Ich versuchte ScheduledExecutorService Thread-Pool es verwenden, aber ich bin immer java.io.NotSerializableException Ausnahme. Kannst du helfen? Sie können die Protokolle in meiner Frage oben sehen. –

Verwandte Themen