機械翻訳について

PSDKを使用したマイクロサービス

Genesysが提供するPSDKを使用して、CTIセッション管理用のJava Microserviceを構築する必要があります。

ここからコードをダウンロードできます(ユーザーがコードにアクセスできるWebサイト・アドレスが必要です)。 現在の自動ダウンロードはドキュメントで機能しません)

マイクロサービスの起動

マイクロサービスを起動するには、次のものが必要です:
  • Java 21
  • Maven
コードをダウンロードしたら、次のステップに従います:
  1. ターミナルでプロジェクト・ルート・フォルダを開きます。
  2. 次のコマンドを実行します:
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/voiceprotocol.jar -DgroupId=com.genesyslab.platform -DartifactId=voiceprotocol -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/commons.jar -DgroupId=com.genesyslab.platform -DartifactId=commons -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/protocol.jar -DgroupId=com.genesyslab.platform -DartifactId=protocol -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/connection.jar -DgroupId=com.genesyslab.platform -DartifactId=connection -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/kvlists.jar -DgroupId=com.genesyslab.platform -DartifactId=kvlists -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/netty-transport.jar -DgroupId=io.netty -DartifactId=netty-transport -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/netty-buffer.jar -DgroupId=io.netty -DartifactId=netty-buffer -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/netty-codec-http.jar -DgroupId=io.netty -DartifactId=netty-codec-http -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/netty-codec-socks.jar -DgroupId=io.netty -DartifactId=netty-codec-socks -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/netty-codec.jar -DgroupId=io.netty -DartifactId=netty-codec -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/netty-common.jar -DgroupId=io.netty -DartifactId=netty-common -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/netty-handler-proxy.jar -DgroupId=io.netty -DartifactId=netty-handler-proxy -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/netty-handler.jar -DgroupId=io.netty -DartifactId=netty-handler -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/netty-resolver.jar -DgroupId=io.netty -DartifactId=netty-resolver -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/netty-transport-native-unix-common.jar -DgroupId=io.netty -DartifactId=netty-transport-native-unix-common -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/connection.jar -DgroupId=com.genesyslab.platform -DartifactId=connection -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/commons.jar -DgroupId=com.genesyslab.platform -DartifactId=commons -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/voiceprotocol.jar -DgroupId=com.genesyslab.platform -DartifactId=voiceprotocol -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/protocol.jar -DgroupId=com.genesyslab.platform -DartifactId=protocol -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=./external/com/gensyslab/platform/kvlists.jar -DgroupId=com.genesyslab.platform -DartifactId=kvlists -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    mvn clean package
  3. このコマンドは、ターゲット・フォルダにjarファイルを生成します。
  4. 次のコマンドを使用して、jarファイルを実行します:
    java -jar target/genesys-service.jar

コンセプト

Java Microservice for CTIセッション管理は、Genesysサービス・プロバイダとメディア・ツールバー・アプリケーションの間のブリッジとして機能します。 Genesysからのイベントは、PSDK APIを介してリスニングされ、メディア・ツールバー・アプリケーションにはwebソケットを介して通知されます。 同様に、メディア・ツールバー・アプリケーションからの操作は、このマイクロサービスを介してGenesysに渡されます。

メッセージ構造

マイクロサービスがGenesysサービスからイベントを受信すると、マイクロサービスはwebソケットを介してそれをメディア・ツールバー・アプリケーションに送信します。 次の例は、マイクロサービスからメディア・ツールバー・アプリケーションに渡されるメッセージの構造を示しています:

public class EventData {
    String eventName;
    long connectionId;
    String ANI;
    String direction;
    String rep_score;
    String eventId;
    String sessionId;
}

次の表に、メッセージ・プロパティの説明を示します:

SI番号 プロパティ名 説明
1 イベント名 Genesysから発射されたイベントの名前。 次の表に示すように、EventRegistered, EventRinging, EventEstablished EventReleasedを指定できます。
2 connectionId コールの接続ID。
3 ANI コールに関連付けられている電話番号。
4 方向 InboundOutboundなどのコールの方向。
5 eventId コールのイベントID。
6 sessionId 現在のセッションのID。

Genysysでサポートされているイベントのリストは、「Genesysドキュメント」を参照してください。

次の表に、PSDKイベントとマイクロサービスから起動されたイベントとの間のマッピングを示します:

SI番号 イベント名 説明
1 EventRegistered エージェントのサインインが完了し、エージェントがコールを受信する準備ができました。
2 EventRinging 着信コール通知
3 EventEstablished 通話受諾通知。
4 EventReleased コール終了通知。

コード・サンプル

次の例に示す関数はすべて、共有プロジェクトのsrc/main/java/com/oracle/genesys/handler/GenesysHandler.javaで定義されています。

チャネル・コード・サンプルの初期化

次に、Genesysサービスのチャネルを初期化する例を示します:

private void initChannel() {
        PropertyConfiguration options = new PropertyConfiguration();
        options.setUseAddp(true);
        options.setAddpClientTimeout(3);
        options.setAddpServerTimeout(4);
        options.setAddpTraceMode(ClientADDPOptions.AddpTraceMode.Local);
        channel = new TServerProtocol(new Endpoint("PSDK-Sample-App", "10.138.194.168", 8080, options));
        ChannelEventsListener channelListener = new ChannelEventsListener();
        channel.addChannelListener(channelListener);
        channel.setMessageHandler(new ReceivedMessageHandler(this));
        channel.setInvoker(new SwingInvoker());
        if (channel.getState() != ChannelState.Closed) {
            return;
        }
        channel.setClientName("test");
        channel.setClientPassword("");
        System.out.println("Connecting...");
    }

リクエスト登録所在地コード・サンプル

次に、Genesysサービスを登録する方法を示します:

private void requestRegisterAddress() {
        RequestRegisterAddress request = RequestRegisterAddress.create(this.DN,
                RegisterMode.ModeShare, ControlMode.RegisterDefault, AddressType.DN);
        try {
            channel.requestAsync(request, this, new CompletionHandler<Message, Object>() {
                public void completed(Message message, Object obj) {
                    System.out.println("Received: \n" + message.toString());
                    if (EventRegistered.ID == message.messageId()) {
                        EventRegistered eventRegistered = (EventRegistered) message;
                        System.out.println("####" + eventRegistered.getThisDN());
                        EventData data = new EventData();
                        data.eventName = message.messageName();
                        GenesysHandler.setAniAndScore(data, eventRegistered.getThisDN());
                        WebHookHandler.sendResponse(data);
                        requestAgentLogin();
                    } else {
                        System.out.println("\n Can't register.");
                    }
                }
                public void failed(Throwable arg0, Object obj) {
                    System.out.println(arg0.getMessage());
                }
            });
        } catch (ChannelClosedOnSendException closedEx) {
            System.out.println("Channel should be opened before sending request");
            System.out.println(closedEx.getMessage());
        } catch (Throwable e) {
            System.out.println(e.getMessage());
        }
    }

リクエスト・エージェント・ログイン・コード・サンプル

次に、エージェントにGenesysサービスへのサインインをリクエストする方法を示します:

private void requestAgentLogin() {
        RequestAgentLogin requestAgentLogin = RequestAgentLogin.create(this.DN, AgentWorkMode.AutoIn, "1010", this.DN, null, null, null);
        try {
            channel.requestAsync(requestAgentLogin, this, new CompletionHandler<Message, Object>() {
                public void completed(Message message, Object obj) {
                    System.out.println("Received: \n" + message.toString());
                    if (EventAgentLogin.ID == message.messageId()) {
                        System.out.println("login");
                    }
                    else {
                        System.out.println("\n Can't login.");
                    }
                }
                public void failed(Throwable arg0, Object obj) {
                    arg0.printStackTrace();
                }
            });
        } catch (ChannelClosedOnSendException closedEx) {
            System.out.println("Channel should be opened before sending request");
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

応答コールのリクエスト

次に、Genesysサービスにコールに応答するようリクエストする方法を示します:

public void acceptCall(String connectionId) {
        RequestAnswerCall requestAnswerCall =
                RequestAnswerCall.create(this.DN, eventRingingSaved.getConnID());
        try {
            Message response = channel.request(requestAnswerCall);
            System.out.println(response.toString());
        } catch (ProtocolException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

リリース・コールのリクエスト

次に、Genesysサービスにコールの切断をリクエストする方法を示します:

public void rejectCall(String connectionId) {
        RequestReleaseCall requestReleaseCall =
                RequestReleaseCall.create(this.DN, eventRingingSaved.getConnID());
        try {
            Message response = channel.request(requestReleaseCall);
            System.out.println(response.toString());
        } catch (ProtocolException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

ReceivedMessageHandlerクラスの定義

チャネルの初期化中に、initChannel 関数に: channel.setMessageHandler(new ReceivedMessageHandler(this));という行が追加されています。 このコールは、Genesysサービスから起動されたイベントの処理を担当します。

ReceivedMessageHandler クラスは次のように定義されます:

package com.oracle.genesys.handler;
 
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.genesyslab.platform.commons.protocol.Message;
import com.genesyslab.platform.commons.protocol.MessageHandler;
import com.genesyslab.platform.voice.protocol.tserver.events.EventAbandoned;
import com.genesyslab.platform.voice.protocol.tserver.events.EventAgentLogin;
import com.genesyslab.platform.voice.protocol.tserver.events.EventAgentReady;
import com.genesyslab.platform.voice.protocol.tserver.events.EventDialing;
import com.genesyslab.platform.voice.protocol.tserver.events.EventEstablished;
import com.genesyslab.platform.voice.protocol.tserver.events.EventLinkConnected;
import com.genesyslab.platform.voice.protocol.tserver.events.EventNetworkReached;
import com.genesyslab.platform.voice.protocol.tserver.events.EventRegistered;
import com.genesyslab.platform.voice.protocol.tserver.events.EventReleased;
import com.genesyslab.platform.voice.protocol.tserver.events.EventRinging;
import com.oracle.genesys.SessionHanlder;
import com.oracle.genesys.model.EventData;
 
import java.io.IOException;
 
public class ReceivedMessageHandler implements MessageHandler {
    private final GenesysHandler genesysHandler;
 
    public ReceivedMessageHandler(GenesysHandler genesysHandler) {
        this.genesysHandler = genesysHandler;
    }
    public void onMessage(Message message) {
        System.out.println("Unsolicited event: \n" + message.toString());
        EventData data = new EventData();
        data.eventName = message.messageName();
        data.sessionId = this.genesysHandler.sessionId;
        String tempAni;
        switch (message.messageId()) {
            case EventLinkConnected.ID:
            case EventAgentLogin.ID:
                break;
            case EventRegistered.ID:
                break;
            case EventAgentReady.ID:
                break;
            case EventRinging.ID:
                EventRinging eventRinging = (EventRinging) message;
                data.eventId = eventRinging.getCallUuid().toLowerCase();
                tempAni = eventRinging.getANI() != null ? eventRinging.getANI() : eventRinging.getOtherDN();
                GenesysHandler.setAniAndScore(data, tempAni);
                data.direction = eventRinging.getCallType().toString();
                data.connectionId = eventRinging.getConnID().toLong();
                genesysHandler.eventRingingSaved = eventRinging;
                break;
            case EventEstablished.ID:
                EventEstablished eventEstablished = (EventEstablished) message;
                data.eventId = eventEstablished.getCallUuid().toLowerCase();
                tempAni = eventEstablished.getANI() != null ? eventEstablished.getANI() : eventEstablished.getOtherDN();
                GenesysHandler.setAniAndScore(data, tempAni);
                data.direction = eventEstablished.getCallType().toString();
                data.connectionId = eventEstablished.getConnID().toLong();
                break;
            case EventReleased.ID:
                EventReleased eventReleased = (EventReleased) message;
                data.eventId = eventReleased.getCallUuid().toLowerCase();
                tempAni = eventReleased.getANI() != null ? eventReleased.getANI() : eventReleased.getOtherDN();
                GenesysHandler.setAniAndScore(data, tempAni);
                data.direction = eventReleased.getCallType().toString();
                data.connectionId = eventReleased.getConnID().toLong();
                break;
            case EventDialing.ID:
                EventDialing eventDialing = (EventDialing) message;
                data.eventId = eventDialing.getCallUuid().toLowerCase();
                tempAni = eventDialing.getANI() != null ? eventDialing.getANI() : eventDialing.getOtherDN();
                GenesysHandler.setAniAndScore(data, tempAni);
                data.direction = eventDialing.getCallType().toString();
                data.connectionId = eventDialing.getConnID().toLong();
                break;
            case EventNetworkReached.ID:
                EventNetworkReached eventNetworkReached = (EventNetworkReached) message;
                data.eventId = eventNetworkReached.getCallUuid().toLowerCase();
                tempAni = eventNetworkReached.getANI() != null ? eventNetworkReached.getANI() : eventNetworkReached.getOtherDN();
                GenesysHandler.setAniAndScore(data, tempAni);
                data.direction = eventNetworkReached.getCallType().toString();
                data.connectionId = eventNetworkReached.getConnID().toLong();
                break;
            case EventAbandoned.ID:
                EventAbandoned eventAbandoned = (EventAbandoned) message;
                data.eventId = eventAbandoned.getCallUuid().toLowerCase();
                tempAni = eventAbandoned.getANI() != null ? eventAbandoned.getANI() : eventAbandoned.getOtherDN();
                GenesysHandler.setAniAndScore(data, tempAni);
                data.direction = eventAbandoned.getCallType().toString();
                data.connectionId = eventAbandoned.getConnID().toLong();
                break;
        }
        WebHookHandler.sendResponse(data);
    }
}

Genesysサービスから起動されたイベントは、onMessageファンクションによって受信されます。 イベント・ペイロードは、ここで定義した共通のメッセージ構造にマップされ、ペイロードはwebソケットに送信されます。 メディア・ツールバー・アプリケーションから、このwebソケットからのメッセージをリスニングできます。