2016-11-26 1 views
0

wicket 응용 프로그램에서 타이머 스레드를 동시에 실행할 수 있습니까? 다음은 내가 수행하려고 시도하는 샘플 코드입니다. 메시지 수신시 일부 지연을 추가하여 타이머를 실행하고 있지만 타이머를 시작하는 순간 주 스레드가 중지되고 타이머가 실행되는 동안 다른 메시지는 수신되지 않습니다. 타이머를 메인 스레드와 병렬로 실행할 수 있습니까? 감사.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); 
    } 
}´ 

로 스케줄 사용하여 아래 로그에서 볼 수 있듯이 내가 java.io.NotSerializableException 예외를 얻고있다 : (실행 별도의 스레드에서) 그림과 같이 당신은 스케줄러 작업 ScheduledExecutorService을 사용할 수 있습니다

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) 

답변

2

TL : 스케줄러를 YourApplication.java로 이동하고 API를 공개하여 태스크를 예약하십시오. 페이지 당 스케줄러가 필요하지 않습니다. 이 도움말을 참조하시기 바랍니다 자세한 내용

: 내가 ScheduledExecutorService를 스레드 풀에게 그것을 사용하여 시도 http://wicketinaction.com/2014/07/working-with-background-jobs/

+0

martin에게 감사드립니다. 스케줄러 부분을 응용 프로그램으로 옮겼으며 정상적으로 작동합니다. :) –

1

을 아래 인라인 의견에 :

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에 대한 자세한 내용을 이해하기위한 here 볼 수 있습니다.

+0

참조하지만 java.io.NotSerializableException 예외를 얻고있다. 도울 수 있니? 당신은 위의 내 질문에 로그를 볼 수 있습니다. –

관련 문제