Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Wicket应用程序中并发运行计时器_Java_Multithreading_Timer_Wicket_Timertask - Fatal编程技术网

Java 在Wicket应用程序中并发运行计时器

Java 在Wicket应用程序中并发运行计时器,java,multithreading,timer,wicket,timertask,Java,Multithreading,Timer,Wicket,Timertask,是否可以在wicket应用程序中并发运行计时器线程? 下面是我正在尝试做的示例代码。 在收到一条消息时,我想增加一些延迟,因此我正在运行计时器,但当我启动计时器时,主线程停止,并且在计时器运行期间,我没有收到任何其他消息。 可以和主线程并行运行计时器吗?谢谢 public class Test extends WebPage{ private Queue<String> msgQueue; Test(){ msgQueue = new Concurre

是否可以在wicket应用程序中并发运行计时器线程? 下面是我正在尝试做的示例代码。 在收到一条消息时,我想增加一些延迟,因此我正在运行计时器,但当我启动计时器时,主线程停止,并且在计时器运行期间,我没有收到任何其他消息。 可以和主线程并行运行计时器吗?谢谢

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);
    }
}´
公共类测试扩展网页{
专用队列msgQueue;
测试(){
msgQueue=新的ConcurrentLinkedQueue();
添加(新的WebSocketBehavior(){
@凌驾
受保护的void onMessage(WebSocketRequestHandler,
短信(短信){
onMessage(处理程序,消息);
handleMessage(处理程序、消息);
}
私有void handleMessage(WebSocketRequestHandler处理程序,TextMessage消息){
添加(msg.getText());
定时器=新定时器();
Application=getApplication();
timer.schedule(新TimerTask(){
@凌驾
公开募捐{
如果(!Application.exists()){
setApplication(应用程序);
}
System.out.println(getApplication());
}
}, 5000);
}
}´
我正在使用ScheduledThreadPoolExecutor获取java.io.NotSerializableException异常,如以下日志所示:

    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)
2016年11月27日晚上8:19:10 org.apache.wicket.serialize.java.JavaSerializer serialize
严重:序列化对象类测试时出错[object=[Page class=Test,id=0,render count=1]]
org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream$ObjectCheckException:对象类型不可序列化!
检查类型为java.util.concurrent.ScheduledThreadPoolExecutor的对象时出现问题

private final java.util.concurrent.ScheduledExecutorService Test.ScheduledExecutorService[class=java.util.concurrent.ScheduledThreadPoolExecutor]您可以使用
ScheduledExecutorService
执行调度器任务(在单独的线程中运行),如下所示,并带有内联注释:

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
    }
公共类测试扩展网页{
//初始化ScheduledExecutorService线程池
专用最终计划执行器服务计划程序=
Executors.newScheduledThreadPool(1);
专用队列msgQueue;
测试(){
msgQueue=新的ConcurrentLinkedQueue();
添加(新的WebSocketBehavior(){
@凌驾
受保护的void onMessage(WebSocketRequestHandler,
短信(短信){
onMessage(处理程序,消息);
handleMessage(处理程序、消息);
}
私有void handleMessage(WebSocketRequestHandler,
短信(msg){
添加(msg.getText());
定时器=新定时器();
最终应用程序Application=getApplication();
//实现在九月线程中运行的Runnable
Runnable Runnable=()->{
如果(!Application.exists()){
setApplication(应用程序);
}
};
//现在启动每5秒运行一次的计划程序
ScheduledFuture timer=scheduler.schedule(可运行,5000,时间单位为秒);
//您可以检查timer.isDone()
}
}
私有静态void enhancedLoop(int[]数字){
//添加您的代码
}

您可以查找以了解有关
ScheduledExecutorService

的更多信息。您可以使用
ScheduledExecutorService
执行调度程序任务(在单独的线程中运行),如下图所示,并提供内联注释:

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
    }
公共类测试扩展网页{
//初始化ScheduledExecutorService线程池
专用最终计划执行器服务计划程序=
Executors.newScheduledThreadPool(1);
专用队列msgQueue;
测试(){
msgQueue=新的ConcurrentLinkedQueue();
添加(新的WebSocketBehavior(){
@凌驾
受保护的void onMessage(WebSocketRequestHandler,
短信(短信){
onMessage(处理程序,消息);
handleMessage(处理程序、消息);
}
私有void handleMessage(WebSocketRequestHandler,
短信(msg){
添加(msg.getText());
定时器=新定时器();
最终应用程序Application=getApplication();
//实现在九月线程中运行的Runnable
Runnable Runnable=()->{
如果(!Application.exists()){
setApplication(应用程序);
}
};
//现在启动每5秒运行一次的计划程序
ScheduledFuture timer=scheduler.schedule(可运行,5000,时间单位为秒);
//您可以检查timer.isDone()
}
}
私有静态void enhancedLoop(int[]数字){
//添加您的代码
}

您可以查找以了解有关ScheduledExecutorService的更多信息。DR:将计划程序移动到YourApplication.java并公开API以计划任务。无论如何,每页都不需要计划程序

有关更多详细信息,请阅读本文:
请参见

TL;DR:将计划程序移动到YourApplication.java中,并公开API以计划任务。无论如何,每页都不需要计划程序

有关更多详细信息,请阅读本文:
请参见

我尝试使用ScheduledExecutorService线程池,但我得到了java.io.NotSerializableException异常。您能帮忙吗?您可以在我的问题中查看日志