Hello All,
I present this case hoping to receive the needed support to resolve it.
Our client has migrated its Call Center Agent infrastructure to Citrix. By Avaya recommendation, OneX Agent desktop Version (2.0.6.9.3001) is installed on the thin client, while agents utilize their VDI.
For some reason (unknown and out of context) the mute generated from the VDI is not working on the thin client, it seems that mute is a softphone native function according to Avaya documentation. This made us utilize the listen hold option from JTAPI to simulate the mute.
We developed this function to mute a call:
public boolean listenMuteHold(String extensionAgente) {
try {
LOG.info("Muting Extension Agent: " + extensionAgente);
LucentV5TerminalEx agentTerminal = (LucentV5TerminalEx) GetProvider().GetCallCenterProvider().getTerminal(extensionAgente);
LucentV11Address address = (LucentV11Address) GetProvider().GetCallCenterProvider().getAddress(extensionAgente);
TerminalConnection[] tc_array = agentTerminal.getTerminalConnections();
if (tc_array != null) {
com.avaya.jtapi.tsapi.impl.LucentV7CallImpl call = (com.avaya.jtapi.tsapi.impl.LucentV7CallImpl) address.getConnections()[0].getCall();
LOG.info("LucentV7CallImpl UCID= " + call.getUCID());
Connection[] cons = call.getConnections();
LOG.info("Connections length: " + cons.length);
for (Connection con2 : cons) {
String participant = con2.getAddress().getName();
LOG.info("listenHold.Participant=" + participant); //06217 el numero de nice
if (!participant.equalsIgnoreCase(extensionAgente)) {
if (con2.getTerminalConnections() != null && con2.getTerminalConnections().length > 0) {
LOG.info("listenHold.TerminalConnections=" + con2.getTerminalConnections().length);
for (TerminalConnection tc1 : con2.getTerminalConnections()) {
LucentV5TerminalConnection participantClient = (LucentV5TerminalConnection) tc1;
for (TerminalConnection tc2 : tc_array) {
LOG.info("listenHold.participantClient=" + participantClient.getTerminal().getName());
LucentV5TerminalConnection supervisorTC = (LucentV5TerminalConnection) tc2;
LOG.info("listenHold.supervisorTC=" + supervisorTC.getTerminal().getName());
participantClient.listenHold(supervisorTC);
supervisorTC.listenHold(participantClient);
}
}
LOG.info("listenHold = true");
} else {
LOG.info("listenHold.Connection");
LucentV5Connection participantClient = (LucentV5Connection) con2;
LucentV5TerminalConnection supervisorTC = (LucentV5TerminalConnection) tc_array[0];
participantClient.listenHold(supervisorTC);
LOG.info("listenHold = true");
}
}
}
} else {
LOG.info("Not in Call");
return false;
}
} catch (InterruptedException | InvalidArgumentException | TsapiInvalidStateException | TsapiMethodNotSupportedException | TsapiPrivilegeViolationException | TsapiResourceUnavailableException ex) {
LOG.error("listenMuteHold", ex);
return false;
}
LOG.info("listenHold = true");
return true;
}
For the
inbound calls it works perfectly, which means we could set a 'simulated mute' for the client. However, for the outbound calls (agents is making the call) it does not work and generates the following error:
2021-04-09 10:32:30,934 ERROR [AgentCTRL] (JavaFX Application Thread:) listenMuteHold
com.avaya.jtapi.tsapi.TsapiResourceUnavailableException: CSTA Error: 44
at com.avaya.jtapi.tsapi.tsapiInterface.TSErrorMap.throwCSTAException(TSErrorMap.java:95)
at com.avaya.jtapi.tsapi.tsapiInterface.TsapiSession.send(TsapiSession.java:578)
at com.avaya.jtapi.tsapi.tsapiInterface.TsapiSession.send(TsapiSession.java:476)
at com.avaya.jtapi.tsapi.tsapiInterface.Tsapi.CSTAEscapeService(Tsapi.java:1493)
at com.avaya.jtapi.tsapi.impl.core.TSProviderImpl.sendPrivateData(TSProviderImpl.java:1180)
at com.avaya.jtapi.tsapi.impl.core.TSProviderImpl.sendPrivateData(TSProviderImpl.java:1157)
at com.avaya.jtapi.tsapi.impl.core.TSConnection.listenHold(TSConnection.java:713)
at com.avaya.jtapi.tsapi.impl.TsapiTerminalConnection.listenHold(TsapiTerminalConnection.java:258)
at mx.wcontact.banorte.jtapi.businesslogic.AgentCTRL.listenMuteHold(AgentCTRL.java:161)
at mx.com.wcontact.avaya.botonera.controller.FXMLSinContingenciaController.handleMuteAction(FXMLSinContingenciaController.java:46)
at sun.reflect.GeneratedMethodAccessor8.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.reflect.misc.Trampoline.invoke(Unknown Source)
at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(Unknown Source)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(Unknown Source)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.event.Event.fireEvent(Unknown Source)
at javafx.scene.Node.fireEvent(Unknown Source)
at javafx.scene.control.Button.fire(Unknown Source)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.event.Event.fireEvent(Unknown Source)
at javafx.scene.Scene$MouseHandler.process(Unknown Source)
at javafx.scene.Scene$MouseHandler.access$1500(Unknown Source)
at javafx.scene.Scene.impl_processMouseEvent(Unknown Source)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at com.sun.glass.ui.View.notifyMouse(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Is there any reason for which this isn't working for outbound calls? In the case this does not work in the end, is there any other option we could use for this case?
We will appreciate your help and comments.
Best Regards
Luis Longoria