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)
Vielen Dank martin, ich habe den Scheduler Teil zur Anwendung verschoben und es funktioniert gut. :) –