コード例 #1
0
  /** {@inheritDoc} */
  @SuppressWarnings("deprecation")
  public void stop() {
    this.isRunning_ = false;

    if (this.isListening_ == false) {
      try {
        //  通信用ポートBind待ち状態のために、割り込みを行う
        Thread acceptThread = this.acceptThread_;
        if (acceptThread != null) {
          acceptThread.interrupt();
        }
      } catch (Exception ex) {
        LOGGER.warn(ex);
      }
    }

    if (this.isListening_) {
      // 待ち受けソケットを閉じることにより、accept()でSocketExceptionが
      // 発生し、待ち受けスレッドが停止する。
      if (this.objServerSocket_ != null) {
        try {
          this.objServerSocket_.close();
        } catch (Exception ex) {
          LOGGER.warn(ex);
        }
      }

      this.isListening_ = false;
    }
  }
コード例 #2
0
  /** {@inheritDoc} */
  @SuppressWarnings("deprecation")
  public void start(int port) {
    if (this.objServerSocket_ != null) {
      return;
    }

    this.startPort_ = port;
    this.port_ = this.startPort_;

    if (this.isRange_ == true) {
      String key = "";
      String message = "";
      if (isPortNumValid(this.port_, this.rangeMax_) == true) {
        key = "javelin.communicate.JavelinAcceptThread.initRange";
        message = CommunicatorMessages.getMessage(key, this.startPort_, this.rangeMax_);
        LOGGER.info(message);
      } else {
        key = "javelin.communicate.JavelinAcceptThread.rangeError";
        message = CommunicatorMessages.getMessage(key, this.startPort_);
        LOGGER.warn(message);
        this.isRange_ = false;
      }
    }

    // クライアント接続の受付を開始する。
    try {
      this.acceptThread_ = new Thread(this, acceptThreadName_);
      this.acceptThread_.setDaemon(true);
      this.acceptThread_.start();
    } catch (Exception objException) {
      LOGGER.warn(objException);
    }
  }
コード例 #3
0
  /** {@inheritDoc} */
  @SuppressWarnings("deprecation")
  @Override
  protected void doJudgeElement(final JavelinLogElement element) {
    // 識別子が"Event"でない場合は、処理しない。
    String type = element.getBaseInfo().get(JavelinLogColumnNum.ID);
    boolean isEvent = MSG_EVENT.equals(type);

    if (isEvent == false) {
      return;
    }

    String eventName = element.getBaseInfo().get(JavelinLogColumnNum.EVENT_NAME);

    // イベント名が "IntervalError" の場合、検出を行う。
    if (EventConstants.NAME_INTERVALERROR.equals(eventName) == false) {
      return;
    }

    Map<String, String> eventInfoMap =
        JavelinLogUtil.parseDetailInfo(element, JavelinParser.TAG_TYPE_EVENTINFO);
    String actual = eventInfoMap.get(EventConstants.PARAM_INTERVALERROR_ACTUAL_INTERVAL);

    // 実際にかかった時間が閾値以下の場合は、処理を終了する。
    long actualTime = Long.MAX_VALUE;
    try {
      actualTime = Long.parseLong(actual);
    } catch (NumberFormatException ex) {
      LOGGER.warn(ex);
    }
    if (actualTime > this.threshold) {
      return;
    }

    classMethodMatching(element, eventInfoMap, actualTime);
  }
コード例 #4
0
  /** ポートが既に開かれている場合に待機する。 */
  @SuppressWarnings("deprecation")
  private void sleep() {
    int interval = this.bindInterval_;

    try {
      Thread.sleep(interval);
    } catch (InterruptedException iex) {
      LOGGER.warn(iex);
    }
  }
コード例 #5
0
  @SuppressWarnings("deprecation")
  private void accept(final ThreadGroup group) throws SocketException {
    Socket clientSocket = null;

    String key = "";
    String message = "";
    try {
      // モニター
      clientSocket = this.objServerSocket_.accept();
    } catch (SocketException se) {
      // stop()でソケットを閉じた場合にSocketExceptionが発生する。
      throw se;
    } catch (IOException ioe) {
      key = "javelin.communicate.commonMessage.serverSocketAcceptError";
      message = CommunicatorMessages.getMessage(key);
      LOGGER.warn(message, ioe);
      return;
    }

    int clientCount = sweepClient();
    if (clientCount > MAX_SOCKET) {
      LOGGER.info("接続数が最大数[" + MAX_SOCKET + "]を超えたため、接続を拒否します。");
      try {
        clientSocket.close();
      } catch (IOException ioe) {
        key = "javelin.communicate.commonMessage.clientSocketCloseError";
        message = CommunicatorMessages.getMessage(key);
        LOGGER.warn(message, ioe);
      }
      return;
    }

    InetAddress clientIP = clientSocket.getInetAddress();
    key = "javelin.communicate.commonMessage.clientConnect";
    message = CommunicatorMessages.getMessage(key, clientIP);
    LOGGER.info(message);

    // クライアントからの要求受付用に、処理スレッドを起動する。
    JavelinClientThread clientRunnable;
    try {
      clientRunnable = createJavelinClientThread(clientSocket);
      Thread objHandleThread =
          new Thread(
              group, clientRunnable, acceptThreadName_ + "-JavelinClientThread-" + clientCount);
      objHandleThread.setDaemon(true);
      objHandleThread.start();

      // 通知のためのクライアントリストに追加する。
      synchronized (this.clientList_) {
        this.clientList_.add(clientRunnable);
      }
    } catch (IOException ioe) {
      LOGGER.warn("クライアント通信スレッドの生成に失敗しました。", ioe);
    }

    // 接続完了をリスナに通知
    String hostName = clientIP.getHostName();
    String ip = clientIP.getHostAddress();
    int port = clientSocket.getPort();
    notifyClientConnected(hostName, ip, port);
  }
コード例 #6
0
  /** 通信用スレッドを実行する。 */
  @SuppressWarnings("deprecation")
  public void run() {
    try {
      Thread.sleep(this.waitForThreadStart_);
    } catch (Exception ex) {
      // Do nothing.
    }

    ThreadGroup group = new ThreadGroup("JavelinThreadGroup");
    String key = "";
    String message = "";

    this.isRunning_ = true;

    while (this.isRunning_ == true && this.isListening_ == false) {
      try {
        this.objServerSocket_ = new ServerSocket(this.port_);

        key = "javelin.communicate.JavelinAcceptThread.start";
        message = CommunicatorMessages.getMessage(key, this.port_);
        LOGGER.info(message);
        this.isListening_ = true;
      } catch (IOException objIOException) {
        int interval = this.bindInterval_;
        key = "javelin.communicate.JavelinAcceptThread.restart";
        message = CommunicatorMessages.getMessage(key, this.port_, interval);
        LOGGER.warn(message);
        if (this.isRange_ == true) {
          // ポート番号を1増やして再接続を行う。
          // 接続範囲を超えた場合には、javelin.bind.intervalの間スリープした後、処理を再度実行する。
          this.port_++;
          if (this.port_ > this.rangeMax_) {
            key = "javelin.communicate.JavelinAcceptThread.overRange";
            message = CommunicatorMessages.getMessage(key, this.rangeMax_, this.startPort_);
            LOGGER.info(message);
            this.port_ = this.startPort_;
          }
        }
        sleep();
      }
    }

    while (this.isRunning_) {
      try {
        try {
          accept(group);
        } catch (RuntimeException re) {
          key = "javelin.communicate.snmp.TrapListener.SendingTelegramErrorMessage";
          message = CommunicatorMessages.getMessage(key);
          LOGGER.warn(message, re);
        }
      } catch (Throwable th) {
        LOGGER.warn(th);
      }
    }

    synchronized (this.clientList_) {
      for (int index = this.clientList_.size() - 1; index >= 0; index--) {
        JavelinClientThread client = this.clientList_.get(index);
        client.stop();
      }
    }

    try {
      if (this.objServerSocket_ != null && this.isConnected()) {
        this.objServerSocket_.close();
      }
    } catch (IOException ioe) {
      key = "javelin.communicate.commonMessage.serverSocketCloseError";
      message = CommunicatorMessages.getMessage(key);
      LOGGER.warn(message, ioe);
    }
  }