2. プログラミング・開発ガイド

Developer’s Studioを使用したエッジアプリケーションの基本的な開発方法や考え方を説明します。

2.1. エッジアプリケーションの作成

エッジアプリケーションはエッジ層で動作します。センサーからデータを受け取り、任意の条件に合致したデータをピックアップしてクラウド層にデータを送信することが可能です。また、エッジアプリケーションはEAFファイルとしてパッケージ化することができます。EAFファイルは .eaf という拡張子でなければなりません。

2.1.1. データ正規化AP

データ正規化APはセンサーから受信したデータをリアルタイム分析(CEP)やクラウド層で利用できるように正規化するためのJavaプログラムです。
OSGiバンドルプロジェクトでは、このJavaプログラムの開発とマニフェストファイルの編集によりOSGiバンドルを作成します。
本節ではOSGiバンドルプロジェクトの基本的な使用方法を説明します。

2.1.1.1. 手順1 OSGiバンドルプロジェクトの新規作成

1. [ファイル]-[新規作成]-[プロジェクト]-[EAF]-[OSGiバンドルプロジェクト]を選択し「次へ」を押下


図 OSGiバンドルプロジェクトの選択

2. プロジェクト名を指定し「次へ」を押下


図 プロジェクト名の指定

3. Activatorクラスを新規作成にチェックを入れ、Activatorクラス名を指定し「終了」を押下するとOSGiバンドルが作成されます。

2.1.1.2. 手順2 Activatorクラスの作成

<\WebOTXインストールフォルダ>\Developer\Studio\workspace\<OSGiバンドルプロジェクト名>\src\<パッケージ名>\<Activatorのjavaファイル名>を編集します。


図 Activatorクラス編集画面

以下はデータ正規化APの実装例です。データ正規化APのAPI使用箇所をコメントで説明します。 データ正規化APのAPIリファレンスを参照してください。

package com.nec.eaf.demo.inbound;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.nec.eaf.inbound.*;  //データ正規化APのAPIをインポート

public class InboundTweLite2525A implements Runnable {

    private InboundClient client;
    private BufferedReader deviceInputReader;
    private volatile boolean runFlag = true;

    private void setup() throws IOException {
        String ip = "127.0.0.1";
        int port = 6666;

        //エッジ層からデータを受け取るIP,ポート番号を指定しクライアントを生成(正規化したデータをリアルタイム分析(CEP)に送信するためのクライアント)
        client = new Netty4InboundClient(ip, port);

        String device = "/opt/eaf/container/deploy/acceleration_data";
        deviceInputReader = new BufferedReader(
                new FileReader(new File(device)));
    }

    public void run() {
        try {
            setup();
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        
        try {
            Thread.sleep(20 * 1000);
        } catch (Exception e) {
            // do nothing
        }
        
        try {
            while (runFlag) {
                Thread.sleep(1000);
                Acceleration acceleration = readAccelerationData(
                        deviceInputReader);

                if (acceleration == null) {
                    continue;
                }

                InboundData data = new InboundData();
                try {
                    data.setData(acceleration);
                    data.setDesc("a data of TWE-LITE-2525A");
                    data.setID("TWE-LITE-2525A");
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
                if (client != null) {
                    try {
                        client.send(data);  //正規化したデータをリアルタイム分析(CEP)に送信
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            // do nothing
        } finally {
            if (client != null) {
                try {
                    client.close(); //クライアントをクローズ
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (deviceInputReader != null) {
                try {
                    deviceInputReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    ----- 以下省略 -----
        
package com.nec.eaf.demo.inbound;

import org.apache.ignite.cache.query.annotations.QuerySqlField; //データ正規化APのAPIをインポート

public class Acceleration {
    @QuerySqlField (index = true) //アノテーションを指定することでリアルタイム分析(CEP)のSQLクエリから"x"を参照可能とする
    private int x;
    @QuerySqlField (index = true) //アノテーションを指定することでリアルタイム分析(CEP)のSQLクエリから"y"を参照可能とする
    private int y;
    @QuerySqlField (index = true) //アノテーションを指定することでリアルタイム分析(CEP)のSQLクエリから"z"を参照可能とする
    private int z;

    public Acceleration(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public int getZ() {
        return z;
    }
    public void setZ(int z) {
        this.z = z;
    }
}
        
2.1.1.3. 手順3 マニフェストファイルの編集
1. META-INF\MANIFEST.MFを開き、[ランタイム]タブでエクスポートするパッケージを選択し、プロパティからバージョンを指定します。


図 エクスポートパッケージの選択


図 エクスポートパッケージのバージョンの指定

2. [MANIFEST.MF]タブで「"Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"」を記述し保存します。


図 MANIFEST.MFタブ

2.1.2. エッジアプリケーションプロジェクト

エッジアプリケーションプロジェクトではルート定義ファイルの作成、データ正規化APの取り込み、エクスポートによりEAFファイルを作成することができます。
本節ではエッジアプリケーションプロジェクトの基本的な使用方法を説明します。

2.1.2.1. 手順1 エッジアプリケーションプロジェクトの新規作成

[ファイル]-[新規作成]-[プロジェクト]-[EAF]-[エッジアプリケーションプロジェクト]を選択しプロジェクト名を指定して「終了」を押下することでプロジェクトを新規作成します。


図 エッジアプリケーションプロジェクト名の指定

2.1.2.2. 手順2 ルート定義ファイルの作成

ルート定義ファイル(Archive/routes/Route.xml)をテキストエディタで開き編集します。
センサー、エッジ層、クラウド層へのルートを定義します。リアルタイム分析(CEP)で使用するSQLクエリもルート定義ファイルで指定します。
考え方は [プログラミング・開発ガイド > エッジアプリケーションの作成 > ルート定義ファイルSQLクエリ] を参照してください。


図 ルート定義ファイルの編集

2.1.2.3. 手順3 データ正規化APの取り込み(OSGiバンドルプロジェクトとの関連付け)

以下の手順でデータ正規化APを作成したOSGiバンドルプロジェクトと関連付けを行うことで、データ正規化APをエッジアプリケーションに取り込むことができます。
1. エッジアプリケーションプロジェクト名を右クリックし「プロパティ」から「プロジェクト参照」画面を開く
2. データ正規化APを作成したOSGiバンドルプロジェクト名を選択しOKボタン押下


図 OSGiバンドルプロジェクトとの関連付け

2.1.2.4. 手順4 EAFファイルのエクスポート

EAFファイルのエクスポートには以下の3通りの手順があります。

EAFファイルを任意のフォルダに出力する場合

1. エッジアプリケーションプロジェクト名を右クリックし「エクスポート」-「EAF」-「EAFファイル」を選択


図 EAFファイルのエクスポート選択

2. 「参照」ボタンを押下し、出力先フォルダとEAFファイル名を指定し「終了」ボタンを押下


図 エクスポートするEAFファイルの選択

エッジアプリケーションプロジェクトを指定しリポジトリ機能に出力(登録)する場合

本手順ではリポジトリ機能を事前に設定しておく必要があります。[プログラミング・開発ガイド > リポジトリ機能環境の構築]を参照してください。

1. エッジアプリケーションプロジェクト名を右クリックし「エクスポート」-「EAF」-「エッジアプリケーションを配備先へ」を選択


図 エッジアプリケーションを配備先へ

2. 登録するリポジトリ機能を指定し、「エッジアプリケーションプロジェクト」にチェックを入れ「次へ」ボタンを押下


図 リポジトリ機能とエッジアプリケーションプロジェクト名指定

3. 「グループ」「名前」「バージョン」「バリエーション」「配備条件式」を指定し「次へ」ボタンを押下


図 リポジトリ機能に登録するためのメタデータ指定

4. エッジ層に配備した際に実行するLinuxコマンドラインを指定し「終了」ボタンを押下


図 エッジ層に配備した際に実行するLinuxコマンドライン指定画面

エクスポート済みのEAFファイルをリポジトリ機能に出力(登録)する場合

本手順ではリポジトリ機能を事前に設定しておく必要があります。[プログラミング・開発ガイド > リポジトリ機能環境の構築]を参照してください。

1. エッジアプリケーションプロジェクト名を右クリックし「エクスポート」-「EAF」-「エッジアプリケーションを配備先へ」を選択


図 エッジアプリケーションを配備先へ

2. 登録するリポジトリを指定し、「EAFファイル」にチェックを入れ「参照」ボタンを押下し、出力先フォルダとEAFファイル名を指定して「次へ」ボタンを押下


図 リポジトリ機能とEAFファイル名指定

3. 「グループ」「名前」「バージョン」「バリエーション」「配備条件式」を指定し「次へ」ボタンを押下


図 リポジトリ機能に登録するためのメタデータ指定

4. エッジ層に配備した際に実行したいLinuxコマンドラインを指定し「終了」ボタンを押下


図 エッジデバイスに配備した際に実行するLinuxコマンドライン指定画面

2.1.3. ルート定義ファイル

ルート定義ファイルはエッジアプリケーションプロジェクトのArchive/routes/Route.xmlに配置されるファイルで、センサデータ受信〜クラウドアダプタ〜クラウド層までのルートを定義します。
以下はルート定義ファイルの例です。

<?xml version="1.0" encoding="UTF-8" ?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
    <camelContext xmlns="http://camel.apache.org/schema/blueprint" id="eaf">
        <route>
            <from uri="netty4:tcp://127.0.0.1:6666?serverInitializerFactory=#json&encoding=UTF-8&sync=false"/> <!-- @ -->
            <to uri="bean:CepProcessorWriteAdapter?method=process"/>
        </route>
        <route>
            <from uri="timer://foo?fixedRate=true&period=1000"/> <!-- A -->

            <!-- select one of below elements -->
            <to uri="bean:CepProcessorReadAdapter?method=selectEntity"/> <!-- B -->
            <!--<to uri="bean:CepProcessorReadAdapterForSelectElement?method=selectElement"/>--> <!-- B -->

            <to uri="bean:OutboundAdapter?method=processCep"/>
        </route>
        
        <!-- If you want to receive message from MQTT message broker, please uncomment below. --> <!-- C -->
        <!-- 
        <route>
            <from uri="mqtt://events?subscribeTopicName=NEC_EAF_OUTBOUND_ADAPTER_OUT" />
            <to uri="${define your process}" />
        </route>
        -->
    </camelContext>

    <!-- Inbound -->
    <bean id="json" class="com.nec.eaf.inbound.StringServerPipelineFactory"/>
    <bean id="protobuf" class="com.nec.eaf.inbound.ProtobufServerPipelineFactory"/>
    <bean id="string" class="com.nec.eaf.inbound.LineStringServerPipelineFactory"/>
    <!-- CEP -->
    <bean id="CepProcessorWriteAdapter" class="com.nec.eaf.cep.processor.CepProcessorWriteAdapter">
        <property name="classname">
            <value>com.nec.eaf.demo.inbound.Acceleration</value> <!-- D -->
        </property>
        <property name="cepjar">
            <value>osgi-manual.jar</value> <!-- E -->
        </property>
    </bean>
    <bean id="CepProcessorReadAdapter" class="com.nec.eaf.cep.processor.CepProcessorReadAdapter">
        <property name="classname">
            <value>com.nec.eaf.demo.inbound.Acceleration</value> <!-- F -->
        </property>
        <property name="cepjar">
            <value>osgi-manual.jar</value> <!-- G -->
        </property>
        <property name="sql">
            <value>select * from Acceleration where ABS(x) < 10 AND ABS(y) < 10 AND ABS(z) < 10</value> <!-- H -->
        </property>
        <property name="isDelete">
            <value>off</value> <!-- I -->
        </property>
    </bean>
    <bean id="CepProcessorReadAdapterForSelectElement" class="com.nec.eaf.cep.processor.CepProcessorReadAdapter">
        <property name="sql">
            <value>${the sql for data query}</value> <!-- H -->
        </property>
        <property name="isDelete">
            <value>off</value> <!-- I -->
        </property>
    </bean>

    <!-- Outbound -->
    <bean id="OutboundAdapter" class="com.nec.eaf.outbound.OutboundAdapter">
        <property name="url">
            <value>http://${your server host name}/outbound-server-adapter/service</value> <!-- J -->
        </property>
        <property name="protocol">
            <value>http</value> <!-- K -->
        </property>
        <property name="dataformat">
            <value>JSON</value> <!-- L -->
        </property>
        <property name="sendtype">
            <value>sse</value> <!-- M -->
        </property>
        <property name="classname">
            <value>com.nec.webotx.eap.demo.servlet.JsonServlet</value> <!-- N -->
        </property>
        <property name="methodname">
            <value>doGet</value> <!-- O -->
        </property>
    </bean>
</blueprint>

        
2.1.3.1. camelContext タブの編集方法
camelContext タブは4通りのルート候補から選択します。以下が4通りのルート候補と camelContext タブの編集例です。作成するエッジアプリケーションに合わせて編集してください。

表 camelContext タブの編集方法
ルート候補
編集例
センサからの受信

クラウド層への送信
<camelContext xmlns="http://camel.apache.org/schema/blueprint" id="eaf">
    <route>
        <from uri="netty4:tcp://127.0.0.1:6666?serverInitializerFactory=#json&encoding=UTF-8&sync=false"/> <!-- @ -->
        <!-- <to uri="bean:CepProcessorWriteAdapter?method=process"/> -->
    <!-- </route> -->
    <!-- <route> -->
        <!-- <from uri="timer://foo?fixedRate=true&period=1000"/> <!-- A --> -->

        <!-- select one of below elements -->
        <!-- <to uri="bean:CepProcessorReadAdapter?method=selectEntity"/> <!-- B --> -->
        <!-- <to uri="bean:CepProcessorReadAdapterForSelectElement?method=selectElement"/>--> <!-- B -->

        <to uri="bean:OutboundAdapter?method=processCep"/>
    </route>
        
    ------ 省略 ------
</camelContext>
センサからの受信

リアルタイム分析(CEP)への書き込み

リアルタイム分析(CEP)からの読み込み

クラウド層への送信
※削除行なし
<camelContext xmlns="http://camel.apache.org/schema/blueprint" id="eaf">
    <route>
        <from uri="netty4:tcp://127.0.0.1:6666?serverInitializerFactory=#json&encoding=UTF-8&sync=false"/> <!-- @ -->
        <to uri="bean:CepProcessorWriteAdapter?method=process"/>
    </route>
    <route>
        <from uri="timer://foo?fixedRate=true&period=1000"/> <!-- A -->

        <!-- select one of below elements -->
        <to uri="bean:CepProcessorReadAdapter?method=selectEntity"/> <!-- B-1 -->
        <!--<to uri="bean:CepProcessorReadAdapterForSelectElement?method=selectElement"/>--> <!-- B-2 -->

        <to uri="bean:OutboundAdapter?method=processCep"/>
    </route>

    ------ 省略 ------
</camelContext>
センサからの受信

リアルタイム分析(CEP)への書き込み
<camelContext xmlns="http://camel.apache.org/schema/blueprint" id="eaf">
    <route>
        <from uri="netty4:tcp://127.0.0.1:6666?serverInitializerFactory=#json&encoding=UTF-8&sync=false"/> <!-- @ -->
        <to uri="bean:CepProcessorWriteAdapter?method=process"/>
    </route>
    <!-- <route> -->
        <!-- <from uri="timer://foo?fixedRate=true&period=1000"/> <!-- A --> -->

        <!-- select one of below elements -->
        <!-- <to uri="bean:CepProcessorReadAdapter?method=selectEntity"/> <!-- B --> -->
        <!-- <to uri="bean:CepProcessorReadAdapterForSelectElement?method=selectElement"/>--> <!-- B -->

        <!-- <to uri="bean:OutboundAdapter?method=processCep"/> -->
    <!-- </route> -->
        
    ------ 省略 ------
</camelContext>
リアルタイム分析(CEP)からの読み込み

クラウド層への送信
<camelContext xmlns="http://camel.apache.org/schema/blueprint" id="eaf">
    <!-- <route> -->
        <!-- <from uri="netty4:tcp://127.0.0.1:6666?serverInitializerFactory=#json&encoding=UTF-8&sync=false"/> <!-- @ --> -->
        <!-- <to uri="bean:CepProcessorWriteAdapter?method=process"/> -->
    <!-- </route> -->
    <route>
        <from uri="timer://foo?fixedRate=true&period=1000"/> <!-- A -->

        <!-- select one of below elements -->
        <to uri="bean:CepProcessorReadAdapter?method=selectEntity"/> <!-- B -->
        <!--<to uri="bean:CepProcessorReadAdapterForSelectElement?method=selectElement"/>--> <!-- B -->

        <to uri="bean:OutboundAdapter?method=processCep"/>
    </route>
        
    ------ 省略 ------
</camelContext>
2.1.3.2. ルート定義ファイルの変更可能箇所
ルート定義ファイル記載例中@〜Oはユーザがエッジアプリケーションや動作環境によって変更可能な項目です。以下に説明します。

ルート定義ファイルの変更可能箇所
項目
説明
@ ・"127.0.0.1" "6666"部分はセンサーからデータ受信するためのエッジ層のIPアドレス、ポート番号をユーザ環境に合わせて指定してください。
・"#json"部分はセンサーから受信するデータの形式に合わせてJSON型の場合は"json"、Protocol Buffers型の場合は"protobuf"を指定してください。
A "period="部分にリアルタイム分析(CEP)からクラウドアダプタへデータ送信する間隔をms単位で指定します。
B フィルタしたデータをクラス型の単位で読み込む場合はB-1の行、文字列型の単位で読み込む場合はB-2の行を有効化してください。
C クラウド層にMQTTでメッセージ送信する場合のみ有効化してください。{define your process}部分には、クラウド層からMQTT受信後に行いたい処理をユーザが定義したクラス名を指定してください。
D データ正規化APで定義したセンサクラス名を指定してください。このクラス内でアノテーション定義をしたデータをリアルタイム分析(CEP)のSQLクエリから参照することができます。アノテーション定義例は [プログラミング・開発ガイド > エッジアプリケーションの作成 > データ正規化AP] を参照してください。
E Dで指定したクラスが含まれる.jarファイル名を指定してください。
F データ正規化APで定義したセンサクラス名を指定してください。このクラス内でアノテーション定義をした変数をリアルタイム分析(CEP)のSQLクエリから参照することができます。アノテーション定義例は [プログラミング・開発ガイド > エッジアプリケーションの作成 > データ正規化AP] を参照してください。
G Fで指定したクラスが含まれる.jarファイル名を指定してください。
H リアルタイム分析(CEP)で使用するSQLクエリを指定します。SQLクエリの詳細は[プログラミング・開発ガイド > エッジアプリケーションの作成 > SQLクエリ] を参照してください。
I リアルタイム分析(CEP)でフィルタしたデータを読み込みクラウドアダプタへ送信後に再利用せずにリアルタイム分析(CEP)上から削除する場合は"on"、再利用する場合は"off"を指定してください。
J クラウド層のサーバアプリケーションの実行URLを指定してください。
MQTTプロトコルで通信する場合は本項目は無効となります。
K クラウド層とHTTPプロトコルで通信する場合は"http"、HTTPSプロトコルで通信する場合は"https"を指定してください。
MQTTプロトコルで通信する場合は本項目は無効となります。
L クラウド層と通信するデータの形式がJSON形式の場合は"JSON"、XML形式で通信する場合は"XML"を指定してください。
M クラウド層とHTTPプロトコルで通信する場合は"sse"、MQTTプロトコルで通信する場合は"mqtt"を指定してください。
N クラウド層に配備するサーバアプリケーションの操作をするためのクラス名を指定してください。
O クラウド層に配備するサーバアプリケーションの操作をするためのメソッド名を指定してください。

2.1.3.3. メッセージ処理数のカウント処理の追加
運用管理コンソール上でメッセージ処理数を表示する場合、以下の定義を追加する必要があります。

手順1:
カウントしたい処理によって 定義 <to uri="bean:MonitorCounter?method=doCount" /> を <route> タグ内に記述してください。

手順2:
bean id="MonitorCounter"を追加してください。運用管理コンソール上のメッセージ処理数は、グループ名、アプリケーション名、バージョン、 バリエーションの4つのメタデータのうち1つでも一致しない場合は別々にカウントします。 メタデータは[プログラミング・開発ガイド > エッジアプリケーションの作成 > エッジアプリケーションプロジェクト > 手順4 EAFファイルのエクスポート] で定義したデータです。

以下が記述例です。
<camelContext xmlns="http://camel.apache.org/schema/blueprint" id="eaf">
    <route>
        <from uri="netty4:tcp://127.0.0.1:6666?serverInitializerFactory=#json&encoding=UTF-8&sync=false"/> <!-- @ -->
        <!-- <to uri="bean:CepProcessorWriteAdapter?method=process"/> -->
        <to uri="bean:MonitorCounter?method=doCount" />  <!-- リアルタイム分析(CEP)へのデータ書き込み回数をカウントする場合 -->
    </route>
    <route>
        <from uri="timer://foo?fixedRate=true&period=1000"/> <!-- A -->

        <!-- select one of below elements -->
        <to uri="bean:CepProcessorReadAdapter?method=selectEntity"/> <!-- B -->
        <!-- <to uri="bean:CepProcessorReadAdapterForSelectElement?method=selectElement"/>--> <!-- B -->
        <to uri="bean:MonitorCounter?method=doCount" />  <!-- リアルタイム分析(CEP)からのデータ読み込み回数をカウントする場合 -->

        <to uri="bean:OutboundAdapter?method=processCep"/>
        <to uri="bean:MonitorCounter?method=doCount" />  <!-- クラウド層へ送信した回数をカウントする場合 -->
    </route>
        
          ------ 省略 ------
    ------ 以下を末尾に追記 ------
    
    <bean id="MonitorCounter" class="com.nec.eaf.monitor.api.MonitorCounter">
        <property name="group">
                <value>{メタデータ:任意のグループ名}</value>
        </property>
        <property name="name">
                <value>{メタデータ:任意のアプリケーション名}</value>
        </property>
        <property name="version">
                <value>{メタデータ:任意のバージョン}</value>
        </property>
        <property name="variation">
                <value>{メタデータ:任意のバリエーション}</value>
        </property>
    </bean>
    
          

2.1.4. SQLクエリ

データ正規化APから受け取ったデータをリアルタイム分析(CEP)でSQLクエリを使用することができます。
SQLクエリは [プログラミング・開発ガイド > エッジアプリケーションの作成 > ルート定義ファイル] の定義例のうちH部分に記述します。
例えば単純フィルタとして "SELECT temperature,pressure from WeatherData where temperature > 20" などと指定することができますが、 データ正規化APに WeatherData クラスが存在し、変数temperatureとpressureがアノテーション定義されている必要があります。アノテーション定義例は [プログラミング・開発ガイド > エッジアプリケーションの作成 > データ正規化AP]を参照してください。
SQLクエリは以下のパターンを利用可能です。

表 SQLクエリのパターン
項目
説明
単純フィルタ
SELECT
受信した任意のデータのうち、指定する条件を満たしているデータにフィルタすることができます。
条件付きフィルタ
副問い合わせ
受信した任意のデータのうち、指定する条件を満たしているデータについて、さらに別条件でフィルタすることができます。
複数イベントフィルタ
JOIN
複数種類のデバイスから受信したデータのうち、指定した条件を満たしているデータにフィルタすることができます。
単純計算フィルタ
avg、sum
受信したデータにの平均値、合計値を条件に指定することができます。

2.1.5. Dockerイメージの生成と実行

本節はDocker環境上でEAFファイルをDockerイメージ化する手順とDockerイメージを起動する手順を掲載します。

2.1.5.1. Dockerコンテナ環境の構築

手順1 Docker環境にEAFコンテナをインストール

1. JavaコマンドとdockerコマンドにPATHを通します。

      # export PATH="$PATH:<javaコマンドのパス>"
      # export PATH="$PATH:<dockerコマンドのパス>"

2. http,httpsのプロキシの環境変数を定義します。

      # export https_proxy=<proxyホストURL>
      # export http_proxy=<proxyホストURL>

3. インストーラの以下のファイルを任意のディレクトリにコピーし展開します。

     # cp -p /media/cdrom/EAF/LINUX/EAF.TGZ / /home
     # tar zxvf EAF.TGZ

4. セットアップスクリプトを実行します。

     # cd edge
     # ./setup.sh
     Start installation of EAF Deployer.
     (略)
     Successfully tagged nec-eaf:latest
     Done.
     Success!

5. インストール後の確認を行います。

以下のようにnec-eaf, nec-eaf-baseのDockerイメージが存在することを確認します。このうち、nec-eafがEAFコンテナです。

     # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE nec-eaf latest f8c8f0f33ee2 5 days ago 237MB nec-eaf-base latest 7b305f6895a1 5 days ago 81.4MB

手順2 EAFコンテナを起動

     # docker run -it nec-eaf /bin/sh /opt/eaf/container/bin/eaf

手順3 次回コンテナ起動時に不要なファイルの削除

     # docker exec -i -t <DockerコンテナID> rm -f /opt/eaf/container/data/id

手順4 EAFファイルをEAFコンテナ内へ配備

     # docker cp <EAFファイル名> <dockerコンテナID>:/opt/eaf/container/deploy/

手順5 custom.propertiesを編集
/opt/eaf/container/etc/custom.properties の最後の行に以下を追記してください。

       com.nec.eaf.cep-initialization-bundle.indexedclassname=com.nec.eaf.demo.inbound.Acceleration
       com.nec.eaf.outbound-adapter-bundle.host=<クラウド層のマシンのホスト名>

手順6 EAFコンテナからDockerイメージ(.tar)を生成

      # docker commit <dockerコンテナID> <dockerイメージID>:<タグ名>
      # docker save <dockerイメージID>:<タグ名> > <dockerイメージ名(.tar)>
2.1.5.2. Dockerイメージの配備・実行

手順1 Dockerイメージ(.tarファイル)からDockerイメージを出力

       # docker load < <dockerイメージ名(.tar)>

手順2 Dockerイメージの起動

       # docker run -it <dockerイメージ名>

2.2. リポジトリ機能環境の構築と設定

EAFファイルをリポジトリ機能に登録するためには、事前にリポジトリ機能環境を構築してURLを設定しておく必要があります。 以下に構築手順と設定手順を説明します。

2.2.1. リポジトリ機能の環境構築手順

WebOTX Application Server をインストールしリポジトリ機能モジュールを配備します。
WebOTX Application Serverがインストールされていない状態でリポジトリ機能モジュールの配備を以下の手順で実施してください。
既にWebOTX Application Serverがインストールされている場合、手順1と手順4のみ実施してください。

手順1. インストールメディアから"EAF\EAF.zipをコピーし、"EAF\cloud\install_config.bat"を以下のように編集

        REM インストールメディアのドライブレターを環境に合わせて変更
        set WEBOTX_MEDIA_ROOT=<インストールメディアのドライブレター>

        REM WebOTXインストールフォルダを環境に合わせて変更
        set AS_INSTALLDIR=<WebOTXインストールフォルダ>

        REM JDKを環境に合わせて変更
        set AS_JAVA_HOME=<JDKインストールフォルダ>
        

手順2. "EAF\cloud\setup1.bat"を実行(WebOTX Application Serverのインストール)
手順3. OS再起動
手順4. "EAF\cloud\setup2.bat"を実行(リポジトリ機能モジュールの配備)
手順5. Internet Explorerで http://<ホスト名>/eaf-console/?tab=repository にアクセスし以下の EAF運用管理コンソールログイン画面 が表示されることを確認。


図 EAF運用管理コンソールログイン画面

2.2.2. リポジトリ機能の設定手順

1. [ウィンドウ]-[設定]-[一般]-[Webブラウザ]を開き、[外部Webブラウザを使用]にチェックを入れ[Internet Explorer]にチェックを入れます。
2. [ウィンドウ]-[設定]-[WebOTX]-[EAF]-[リポジトリ]を開き、[追加]ボタンを押下し名前とリポジトリ機能のURLを指定します。
リポジトリ機能のURLは"http://<ホスト名>/eaf-agent/rest/repository/"の形式で指定してください。


図 リポジトリ機能の設定画面