2014-07-25 3 views
0

서버가 있고 클라이언트의 가동 시간에 대한주기적인 알림을 게시하는 간단한 pub 하위 예제를 구현하려고합니다.스레드가 ZMQ.context (1)을 지나서 진행하지 않습니다.

InnoSetup 및 launch4j 및 Apache procrun/prunsrv와 함께 번들로 제공되는 Windows 서비스의 일부로 실행됩니다.

스레드가 컨텍스트 생성을 넘지 않습니다. 무엇이 잘못 될 수 있습니까?

import java.io.IOException; 
import java.util.Date; 
import org.msgpack.MessagePack; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.zeromq.ZMQ; 
import org.ocpsoft.prettytime.*; 

/** 
* Notification service for updates to configuration in the logger 
* @author Aalhad 
*/ 
public class NotificationServer extends Thread { 

    private final Logger log = LoggerFactory.getLogger(this.getClass()); 
    private volatile boolean shouldRun; 

    private PrettyTime upTime; 
    private PreferenceManager prefMgr = PreferenceManager.getInstance(); 
    public ZMQ.Context context; 
    public ZMQ.Socket pubSocket; 

    public NotificationServer() { 
     log.debug("Entered notification server constructor ......................"); 
     context = ZMQ.context(1); 
     log.debug("THIS DOES NOT GET PRINTED ... it is as if we are blocking in ZMQ.context!!!"); 
     pubSocket = context.socket(ZMQ.PUB); 
     pubSocket.bind("tcp://*:"+prefMgr.getNotificationPort()); 
     pubSocket.bind("ipc://powerlogger"); 

     log.debug("NotificationServer created"); 
    } 

    @Override 
    public void run() { 
     log.debug("Entering run loop of Notification Server"); 
     setStarting(); 
     log.debug("Writing to tcp port: {}", prefMgr.getNotificationPort()); 
     upTime = new PrettyTime();   
     ConfigMessage msg = prefMgr.getConfigMessage(); 
     MessagePack msgPack = new MessagePack(); 
     byte[] sendBytes; 

     try { 
      log.debug("Going ahead and sending: {}", msg); 
      sendBytes = msgPack.write(msg); 
      pubSocket.send(sendBytes); 
      log.debug("Finished sending msg"); 
     } catch (IOException ex) { 
      log.error("Could not send first config notification",ex); 
     } 

     //On starts and restarts, we send the current configuration to our 
     //subscribers 
     String upSince; 
     while (shouldRun()) { 
      log.trace("In the notification loop"); 
      upSince = upTime.format(new Date(0)); 
      log.trace("============================================================== Started: {}", upSince); 
      ConfigMessage cfgMsg = new ConfigMessage(); 
      cfgMsg.msgType = MessageType.UPSINCE; 
      cfgMsg.message = upSince; 

      try { 
       // ..... code here to write the time into a 
       // messagepack structure and publishing it 
       sleep(5000); 
       log.trace("After sleeping in notification loop"); 
      } catch (InterruptedException ex) { 
       log.error("Notification thread disturbed when sleeping."); 
      } 
     } 
    } 

    public synchronized void shutDown() { 
     shouldRun = false; 
     log.trace("Set shouldRun to false in discovery server"); 
     try { 
      if (pubSocket != null) { 
       pubSocket.close(); 
       context.term(); 
      } 
     } 
     catch(Exception e) { 
      log.error("Interesting situation when trying to close the discovery socket when shutting down",e); 
     } 
    } 

    public synchronized void setStarting() { 
     shouldRun = true;   
    } 

    private synchronized boolean shouldRun() { 
     return shouldRun; 
    }  
} 

답변

0

발견. 설치 프로그램을 만들 때 서비스에 jar 파일을 제공하는 것을 잊어 버리는 간단한 문제였습니다. 로그에 클래스를 찾을 수 없다는 메시지가 표시되지 않았습니다.

수정 됨.

관련 문제