/** {@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; } }
/** {@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); } }
/** {@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); }
/** ポートが既に開かれている場合に待機する。 */ @SuppressWarnings("deprecation") private void sleep() { int interval = this.bindInterval_; try { Thread.sleep(interval); } catch (InterruptedException iex) { LOGGER.warn(iex); } }
@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); }
/** 通信用スレッドを実行する。 */ @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); } }