PSDKを使用したマイクロサービス
Genesysが提供するPSDKを使用して、CTIセッション管理用のJava Microserviceを構築する必要があります。
ここからコードをダウンロードできます(ユーザーがコードにアクセスできるWebサイト・アドレスが必要です)。 現在の自動ダウンロードはドキュメントで機能しません)
マイクロサービスの起動
- Java 21
- Maven
- ターミナルでプロジェクト・ルート・フォルダを開きます。
- 次のコマンドを実行します:
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
- このコマンドは、ターゲット・フォルダにjarファイルを生成します。
- 次のコマンドを使用して、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 | 方向 | Inbound 、Outbound などのコールの方向。 |
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ソケットからのメッセージをリスニングできます。