Overview
The Cisco Connector is a Spring Boot service that listens to Cisco JTAPI events, correlates call legs with Cisco CC database records, and forwards conversation activity to the EF CX Platform. For more details please refer to the overview of Cisco-Connector.
Prerequisites
-
Ensure the CUCM_APPLICATION_USER configured via environment variables is assigned the controlled device for which the Cisco connector will listen to live JTAPI events.
-
Ensure a Cisco-type channel is configured in CX with the same service identifier as the conversation in Cisco. Otherwise, the conversation will not be synced in CX.
Limitations / Issues:
-
Stale Call Legs Accumulating in the Processing Queue
When a call happens, multiple call legs are created. Each leg is enriched with data fetched from the Cisco database (CCE/CCX) before being forwarded to the CX platform. However, Cisco does not always have a record for every leg particularly the first/primary leg at the time the batch processor runs. When this happens, the batch job skips the call and logs a warning, but the legs remain in the queue with sync_with_cx = false. Since the query that fetches unsynced legs has no age filter, these legs are picked up again in every subsequent batch run indefinitely, causing the warning logs to pile up and the queue to grow without bound.
Fix: Configurable Expiry for Unresolved Call Legs
A configurable expiry threshold (CALL_LEG_EXPIRY_MINUTES, default 30) was introduced. During each batch run, if no Cisco record is found for a call's first leg and that leg's created_at timestamp is older than the threshold, all legs belonging to that call are marked as abandoned (sync_with_cisco = true, sync_with_cx = true) and persisted removing them from all future batches. An ERROR log is emitted in this case. Legs that are still within the expiry window continue to be retried as before, with a WARN log.
Before deploying, ensure the following are available:
-
A running PostgreSQL instance accessible by the service (Vault Managed)
-
Postgres is installed while deploying CX.
-
-
A running Cisco CUCM instance with a configured application user
-
A running Cisco CC database (CCX)
-
A running EF CX Solution
-
A running Keycloak instance
Step 1: Edit the Deployment file
vi helm-values/cx-ciscoConnector-custom-values.yaml
Step 2: Configure Environment Variables as Required
The service is configured entirely through environment variables. The table below describes each variable.
Postgres - Local Database of Cisco Connector
Cisco Connector uses the CX managed postgres instance.
|
Variable |
Description |
Default Value |
|---|---|---|
|
|
Full JDBC URL (overrides host/port/name if set) |
|
|
|
The role set while configuring vault managed access of postgres. |
|
|
|
Database username |
|
|
|
Database password |
|
Cisco CUCM
|
Variable |
Description |
Example |
|---|---|---|
|
|
CUCM application user username - The user that has the access of the controlled device for which the application will listen the live JTAPI events. |
|
|
|
CUCM application user password |
|
|
|
IP address of the CUCM instance |
|
Cisco CC Database
|
Variable |
Description |
Example |
|---|---|---|
|
|
Contact Center type: |
|
|
|
JDBC engine for CC database |
|
|
|
CC database host |
|
|
|
CC database port |
|
|
|
CC database name |
|
|
|
CC server name |
|
|
|
CC database username |
|
|
|
CC database password |
|
Correlation
|
Variable |
Description |
Default |
|---|---|---|
|
|
Number of records processed per batch |
|
|
|
Interval between correlation runs (ms) |
|
Cisco Connector Specific
|
Variable |
Description |
Default |
|---|---|---|
|
|
Configurable Expiry for Unresolved Call Legs, explained above in the limitation section. |
|
EF CX Platform
|
Variable |
Description |
Example |
|---|---|---|
|
|
Base URL of the EF CX Platform |
|
|
|
Callback URL sent with conversation events |
|
|
|
Number of call legs processed per batch |
|
|
|
Interval between conversation sync runs (ms) |
|
|
|
Service identifier used for outbound calls |
|
|
|
URL of the routing engine |
|
|
|
The tenant ID |
|
|
|
The flag that controls whether a survey is triggered after syncing the conversation in CX. |
|
Phone Number Normalization
These variables control how outbound customer phone numbers are converted from local format to international format before being sent to WhatsApp or SMPP connectors. Normalization ensures that local numbers are converted to international format for connectors that only accept international format (e.g., WhatsApp connector requires international format).
|
Variable |
Description |
Example |
|---|---|---|
|
|
Country code to prepend (leave empty to disable normalization) |
|
|
|
Local trunk prefix to strip before prepending country code (leave empty if the country has no trunk prefix) |
|
How normalization works:
|
|
|
Input |
Output |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
(empty) |
|
|
|
(empty) |
(any) |
|
|
Numbers already in international format (e.g., 923001234567 or +923001234567) are detected and passed through unchanged to prevent double-prefixing.
Keycloak
|
Variable |
Description |
Example |
|---|---|---|
|
|
Keycloak realm name |
|
|
|
Keycloak client ID |
|
|
|
Keycloak client secret |
|
|
|
Agent role name in Keycloak |
|
|
|
Agent role ID in Keycloak |
|
|
|
Keycloak admin username |
|
|
|
Keycloak admin password |
|
Step 3: Verify the Deployment
Check that the pod is running:
kubectl get pods -n expertflow | grep cisco-connector
Check the logs to confirm successful startup and JTAPI connection:
kubectl logs -n expertflow -f cisco-connector --tail=100
On successful startup you should see log lines indicating:
-
Spring Boot application started
-
JTAPI provider connected to CUCM
-
Conversation job scheduled
Step 4: Verify Phone Number Normalization (Optional)
If CUSTOMER_COUNTRY_CODE is configured, the logs will confirm normalization is active when the calls are processed:
Normalized phone number from 03001234567 to 923001234567
If the number is already in international format:
923001234567 is already in normalized form
To disable normalization, leave CUSTOMER_COUNTRY_CODE unset or set it to an empty string:
- name: CUSTOMER_COUNTRY_CODE
value: ""