Please login or register to access secure site features.

Note: By continuing to use DevConnect Program Services you agree to our latest Registered Member Terms.

Sign in using DevConnect ID

Forgot password?

Trouble logging in?

Submit a ticket for Registration Support.

I have an SSO ID

?
sign in

Don't have a DevConnect or SSO ID ?

Create a DevConnect account or join the program.

register now
^
Forum Index » JTAPI » listenHold on outbound   XML
 
Author Message
longo10


[Avatar]

Joined: 14/07/2014 18:30:31
Messages: 11
Location: Mexico
Offline

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

This message was edited 1 time. Last update was at 09/04/2021 12:02:46

JohnBiggs



Joined: 20/06/2005 14:06:52
Messages: 798
Location: Thornton, CO
Online

Has the destination party answered at the point that you try to do the selective hold on the outbound call?
[WWW]
longo10


[Avatar]

Joined: 14/07/2014 18:30:31
Messages: 11
Location: Mexico
Offline

Yes, the call was already established by the time the selective hold was set.
MartinFlynn



Joined: 30/11/2009 05:00:18
Messages: 1736
Offline

I tried to reproduce your problem using your code in the Agent View sample application but I did not get any error. The SLH requests always returned with success.

To get a better idea of what is happening, I think you will need to examine the TSAPI/ASAI messages sent from the application and to Communication Manager. You can see these messages in the TSAPI trace files (g3 and csta) on AE Services. For information on how to enable and view these traces and, see the Devconnect Product FAQ "What is the procedure for enabling and accessing the AE Services logs for TSAPI (trace, tracing, g3trace, csta_trace)?".
https://www.devconnectprogram.com/site/global/products_resources/avaya_aura_application_enablement_services/support/faq/tsapi/index.gsp#10

If you need further help with this, you should open a technical support ticket as the forum is not a suitable way to analyze large log files.

Martin
longo10


[Avatar]

Joined: 14/07/2014 18:30:31
Messages: 11
Location: Mexico
Offline

Did you tried to use the listen hold in an outbound call you made to somebody from an extension and it did not generate any error?
longo10


[Avatar]

Joined: 14/07/2014 18:30:31
Messages: 11
Location: Mexico
Offline

When we review the csta_trace.out log file in AES Server we can check:

<135>Apr 16 11:21:35 aesnicemty TSAPI[3405]: -05:00 2021 679 1 com.avaya.aes | csta_trace:Thread 0xd4bfbb40 TSERVER Src: DRVR 

<135>Apr 16 11:21:35 aesnicemty TSAPI[3405]: -05:00 2021 679 1 com.avaya.aes | csta_trace:Thread 0xd4bfbb40 Login: "******" App Name: "Jtapi Client" SessionID: 565 Transport ID: 15.36.200.4

<135>Apr 16 11:21:35 aesnicemty TSAPI[3405]: -05:00 2021 679 1 com.avaya.aes | csta_trace:Thread 0xd4bfbb40 InvokeID: 34

<135>Apr 16 11:21:35 aesnicemty TSAPI[3405]: -05:00 2021 679 1 com.avaya.aes | csta_trace:Thread 0xd4bfbb40 Driver: AVAYA#AESNICEMTY#CSTA#AESNICEMTY

<135>Apr 16 11:21:35 aesnicemty TSAPI[3405]: -05:00 2021 679 1 com.avaya.aes | csta_trace:Thread 0xd4bfbb40 Message:

<135>Apr 16 11:21:35 aesnicemty TSAPI[3405]: -05:00 2021 679 1 com.avaya.aes | csta_trace:Thread 0xd4bfbb40 value UniversalFailureConfEvent ::= 

<135>Apr 16 11:21:35 aesnicemty TSAPI[3405]: -05:00 2021 679 1 com.avaya.aes | csta_trace:Thread 0xd4bfbb40 {

<135>Apr 16 11:21:35 aesnicemty TSAPI[3405]: -05:00 2021 679 1 com.avaya.aes | csta_trace:Thread 0xd4bfbb40   error outstandingRequestLimitExceeded

<135>Apr 16 11:21:35 aesnicemty TSAPI[3405]: -05:00 2021 679 1 com.avaya.aes | csta_trace:Thread 0xd4bfbb40 }

<135>Apr 16 11:21:35 aesnicemty TSAPI[3405]: -05:00 2021 679 1 com.avaya.aes | csta_trace:Thread 0xd4bfbb40 


When we review the g3trace.out log file in AES Server we can check:

<135>Apr 16 11:21:35 aesnicemty TSAPI[3405]: -05:00 2021 389 1 com.avaya.aes | g3trace-AESNICEMTY:LinkThread01 error(OUTSTANDING_REQUEST_LIMIT_EXCEEDED)(44)


After checking this document: https://downloads.avaya.com/css/P8/documents/101046357

We can find on page 192 the reason.

Based on what I just exposed before, we understand that using ListenHold to mute an outbound call won’t work since Agent extention is already being monitored by NICE (DMCC), Genesys WDE (DMCC/TSAPI). Is there any other way in which mute could be applied without having Access to the thin client and to OneX Agent desktop?
MartinFlynn



Joined: 30/11/2009 05:00:18
Messages: 1736
Offline

Yes, if another application is using a different AE Services to control the call (e.g. MonitorCall), it can interfere with SLH.

I do not know anything about the environment you are using so I cannot advise you on how to get the mute button to work correctly. However, to the best of my knowledge, many customers use a similar setup so I would expect it to be possible. Your business partner should be able to help you.

For H.323 softphones, I think there is one way to 'mute' the softphone via DMCC that might work but, for SIP phones, I cannot think of any possibilities. For H.323 phones:

1. Configure a "share-talk" button on each station.
2. use DMCC to register a terminal for each station in Dependent/Independent mode.
3. To mute the phone, use DMCC to press the share-talk button.
4. To unmute the phone, use DMCC to press the share-talk button again.

Please note, this will consume a DMCC license per station so would be expensive is you are not already registering terminals.

Martin
 
 
Go to: