[OpenNMS Note] 加我加我加我~ OpenNMS新增Service的方法

這時候開頭不免要誇一下OpenNMS,因為它的模組化架構,讓我們可以輕易的抽取、更換或者新增某一個模組,當然最大的影響還是在於各模組間的Dependency,如果A模組必須依賴B模組,但你抽掉B模組,勢必A就往生了。這在OpenNMS算是滿重要的概念了。

先不介紹OpenNMS用到的那些技術,像spring、Jmx、Dao..等等,因為我敢說我做完整個架構移植,我也只是略懂Orz......。

↓這就是OpenNMS程式碼的目錄。


首先,第一步,我們先將Log4j的log4j.properties設定好。
↓檔案就在這個位置。
\\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-base-assembly\src\main\filtered\etc\log4j.properties

設定內容如下,設定的細節可以參考Log4j的教學網站。

  # BrianSys
  log4j.category.OpenNMS. BrianSys =DEBUG, BRIANSYS
  log4j.additivity.OpenNMS. BrianSys =false
  log4j.category.org.opennms.netmgt.briansys=DEBUG, BRIANSYS
  log4j.additivity.org.opennms.netmgt.briansys =false
  log4j.appender. BRIANSYS =org.apache.log4j.RollingFileAppender
  log4j.appender. BRIANSYS.MaxFileSize=100MB
  log4j.appender. BRIANSYS.MaxBackupIndex=4
  log4j.appender. BRIANSYS.File=/home/ianathome/opennms_workspace/opennms-1.8.16-1/source/target/opennms-1.8.16/logs/daemon/briansys.log
  log4j.appender. BRIANSYS.layout=org.apache.log4j.PatternLayout
  log4j.appender. BRIANSYS.layout.ConversionPattern=%d %-5p [%t] %c{1}: %m%n

其中  log4j.additivity.org.opennms.netmgt.briansys就是你的Service的位置,相對性也就是class的位置。


第二步,參考一下Opennms-daemon,他其實會到ConfigFileConstants.java中,將設定好的一堆Spring File抓出來,所以我們先在這邊把我們預設要撈的Spring File填入程式中。
↓檔案位置。
\\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-config-utils\src\main\java\org\opennms\netmgt\ConfigFileConstants.java

在class中增加下面這個。
   public static final int  BRIANSYS_CONFIG_FILE_NAME;
然後設定一個ID
   BRIANSYS_CONFIG_FILE_NAME = 81; //Brian
將ID指向的陣列指向一個檔名,也就是未來我們要新增configuration用的檔案。
   FILE_ID_TO_NAME[ BRIANSYS_CONFIG_FILE_NAME] = "briansys-configuration.xml";

這時候來把剛剛宣示的檔案建立起來,我不清楚你想用它來幹麻,總之先建起來當備用。
↓位置。
   \\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-base-assembly\src\main\filtered\etc\  briansys-configuration.xml
我建的大概先長這樣,以後要修改再增加就好,基本上這是放一些固定的參數了。
   <BrianSysConfiguration
ConnectLimit="5">
   </ BrianSysConfiguration>

重頭戲來了,要將Service的init()、stop()、start()這類流程控制函式放至Spring中,所在這個service-configuration.xml中要仔細設定好。
↓檔案位置。
\\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-base-assembly\src\main\filtered\etc\service-configuration.xml

↓設定內容如下,可以參考這裡面其他Service的設定。

   <service>
      <name>OpenNMS:Name=BrianSys</name>
      <class-name>org.opennms.netmgt.briansys.jmx. BrianSys</class-name>
      <invoke at="start" pass="0" method="init"/>
      <invoke at="start" pass="1" method="start"/>
      <invoke at="status" pass="0" method="status"/>
      <invoke at="stop" pass="0" method="stop"/>
    </service>

接下來將剛剛設定的configuration的參數導入xsd中,讓castor可以將來生成標準化的程式。
↓檔案位置。
\\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-config\src\main\castor\briansys-configuration.xsd

內容大概像下面這樣。


<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://xmlns.opennms.org/xsd/config/briansys"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:this="http://xmlns.opennms.org/xsd/config/briansys"
        xmlns:ns2="http://www.w3.org/1999/xhtml"
        xmlns:ns="http://www.w3.org/2001/XMLSchema"
        xmlns:hfp="http://www.w3.org/2001/XMLSchema-hasFacetAndProperty">
  <annotation>
    <documentation>XML Schema for the briansys-configuration.xml configuration
    file. Version: $Id$. </documentation>
  </annotation>

  <element name="BrianSysConfiguration">
    <annotation>
      <documentation>Top-level element for the briansys-configuration.xml
      configuration file. </documentation>
    </annotation>

    <complexType>
      <attribute name="ConnectLimit" use="required">
        <annotation>
          <documentation>The maximum number of threads used for reading and
          processing of incoming events.</documentation>
        </annotation>
     
        <simpleType>
          <restriction base="int">
            <minInclusive value="1"/>
          </restriction>
        </simpleType>
      </attribute>
    </complexType>
  </element>
</schema>

再到castor的設定檔將你的service的xsd檔案加入。
↓檔案位置。
    \\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-config\src\main\castor\castorbuilder.properties
加入下面這筆設定。
   http://xmlns.opennms.org/xsd/config/briansys=org.opennms.netmgt.config.briansys,\

接下來再設定一個ConfigFileConstants,跟剛剛的那個不太一樣。
↓檔案位置。
\\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-util\src\main\java\org\opennms\core\utils\ConfigFileConstants.java
一樣增加下面這三行程式,加的方法可以參考檔案中其他程式的作法。
   public static final int BRIANSYS_CONFIG_FILE_NAME;
   BRIANSYS_CONFIG_FILE_NAME = 79; //Brian
   FILE_ID_TO_NAME[BRIANSYS_CONFIG_FILE_NAME] = "briansys-configuration.xml";//Brian

然後我們就要進入opennms-services中,增加我們需要的Service了!

↓請先找到這個檔案。
    \\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-services\.springBeans
然後將你的applicationContext加入其中。
   <config>src/main/resources/META-INF/opennms/applicationContext-briansys.xml</config>

接下來,去建立起你放置你Service的資料夾。
↓在這個資料夾下建立。[briansys] ->是我的servcie名字
    \\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-services\src\main\java\org\opennms\netmgt\[briansys]

基本上整個程式的架構會是這樣
    opennms-services\src\main\java\org\opennms\netmgt\[briansys]\BrianSys.java
    opennms-services\src\main\java\org\opennms\netmgt\[briansys]\jmx\BrianSys.java
    opennms-services\src\main\java\org\opennms\netmgt\[briansys]\jmx\BrianSysMBean.java

真正程式的進入點是在 jmx\BrianSys.java、jmx\BrianSysMBean.java,這是因為他去繼承了AbstractSpringContextJmxServiceDaemon跟BaseOnmsMBean,架構部分我就不在這邊講了。

↓然後再按照其他程式的ConfigManager跟ConfigFactory依樣畫葫蘆,就可以將當初我們設定好的固定參數載入進來。
    \\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-services\src\main\java\org\opennms\netmgt\config\BrianSysConfigManager.java
    \\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-services\src\main\java\org\opennms\netmgt\config\BrianSysConfigFactory.java

接下來就是將applicationContext跟applicationContext的注入跟設定完成。
↓先將下面要建立的applicationContext注入,檔案位置如下。
    \\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-services\src\main\resources\beanRefContext.xml
↓設定如下
     <bean id="briansysContext"     class="org.springframework.context.support.ClassPathXmlApplicationContext">
        <constructor-arg>
          <list>
            <value>META-INF/opennms/applicationContext-briansys.xml</value>
          </list>
        </constructor-arg>
        <constructor-arg ref="daemonContext" />
    </bean>

↓再到下面這個位置,建立applicationContext-briansys.xml。
     \\192.168.10.69\opennms_workspace\opennms-1.8.16-1\source\opennms-services\src\main\resources\META-INF\opennms\

建立方式可以參考其他的applicationContext,或者去認識一下Spring/Jmx。

以上,草率的介紹完畢。

留言

這個網誌中的熱門文章

[Security] wpa_supplicant setup

[Wordpress] 登出時出現 404 Error

[OpenNMS Note] OpenNMS SNMP的誕生