|
ContactCenters V. 0.9.9. |
||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectumontreal.iro.lecuyer.contactcenters.router.Router
public abstract class Router
Represents a contact router which can perform agent and contact selections. A router links the contact sources, agent groups and waiting queues together and acts as a central element of the contact center. It supports a certain number of contact types and contains slots for waiting queues and agent groups.
Dequeued contacts and freed agents are notified to the router through nested
classes implementing the appropriate listener interfaces. These classes
listen to the connected agent groups and waiting queues only. Agent groups
and waiting queues are connected to the router using the
setAgentGroup(int,AgentGroup)
and setWaitingQueue(int,WaitingQueue)
methods, respectively.
During connection, they are assigned a numerical identifier to be referred to
efficiently during routing.
This abstract class does not implement any routing policy. To implement such a policy, many informations must be provided in a subclass: data structures, algorithms for agent, waiting queue and contact selections, and an algorithm to automatically clear waiting queues. A router can also specify what happens when a contact is served or abandons. We now examine these elements in more details. Data structures are encoded into fields, and usually consist of a type-to-group and a group-to-type maps, or matrices of ranks. Algorithms are provided by overriding methods.
When a new contact is notified through its newContact(Contact)
method
specified by the NewContactListener
interface, the router performs
agent selection, i.e., it tries to assign an agent to the contact. The
selectAgent(Contact)
method is used to select the agent, and
selectWaitingQueue(Contact)
is called if no free agent is available.
The router supports contact rerouting which works as follows. When a contact
is queued, the router gets a delay using
getReroutingDelay(DequeueEvent,int)
. If that delay is finite and
greater than or equal to 0, a rerouting event is scheduled. When such
an event happens, the router tries to use
selectAgent(DequeueEvent,int)
to assign an agent to a queued
contact. If this rerouting fails, the router uses
selectWaitingQueue(DequeueEvent,int)
to decide if the contact
should be dropped, transferred into another queue, or kept in the same queue.
After this queue reselection has happened, the router uses
getReroutingDelay(DequeueEvent,int)
again to decide if a subsequent
rerouting will happen. By default, this functionality is disabled. One has
to override getReroutingDelay(DequeueEvent,int)
and
selectAgent(DequeueEvent,int)
to use rerouting.
When an agent becomes free, the router must perform contact selection,
i.e., it must try to assign a queued contact to the free agent through the
checkFreeAgents(AgentGroup,Agent)
method. The checkFreeAgents(AgentGroup,Agent)
method is
called, and usually calls selectContact(AgentGroup,Agent)
to get queued contacts. If
no queued contact is available for the free agent, the agent remains free.
The router also supports agent rerouting which works as follows. If an agent
has finished the service of a contact and cannot find a new contact to serve,
before letting the agent idle, the router gets a delay using
getReroutingDelay(Agent,int)
. If this delay is finite and greater
than or equal to 0, the router schedules an event that will try to assign a
new contact to the agent. The contact is selected using the
selectContact(Agent,int)
method. As with contact rerouting, agent
rerouting can happen multiple times and it is disabled by default. One needs
to use detailed agent groups considering individual agents and override
getReroutingDelay(Agent,int)
as well as
selectContact(Agent,int)
to take advantage of agent rerouting.
At some moments during the day, queued contacts may never be served, because
no skilled agent is present. For example, when the center closes, all agents
leave and queued contacts are forced to wait forever or abandon. To avoid
this, an additional algorithm may be implemented in
checkWaitingQueues(AgentGroup)
to automatically clear the queues when no agent
can serve contacts. This clearing is disabled by default but can be enabled
by using setClearWaitingQueue(int,boolean)
or setClearWaitingQueues(boolean)
.
Finally, the moment a contact exits can be controlled. By default, dequeued and served contacts exit the system, but it is possible to override methods in this class to change this behavior, e.g., transfer a dequeued contact to another queue, transfer a served contact to another agent, etc.
Note that the blocking, dequeue, end-contact and end-service indicators
Integer.MAX_VALUE - 1000 through Integer.MAX_VALUE are
reserved for present and future use by routers.
Dequeue type 0 is also reserved, and
represents the beginning of the service
for a queued contact.
The constant DEQUEUETYPE_BEGINSERVICE
can be used to represent this.
Note: the ExitedContactListener
implementations are notified in the
order of the list returned by getExitedContactListeners()
, and an
exited-contact listener modifying the list of listeners by using
addExitedContactListener(ExitedContactListener)
or removeExitedContactListener(ExitedContactListener)
could result in unpredictable behavior.
Field Summary | |
---|---|
static int |
BLOCKTYPE_CANTQUEUE
Contact blocking type occurring when a contact cannot be queued, i.e., selectWaitingQueue(Contact) returns null. |
static int |
BLOCKTYPE_NOLINE
Contact blocking type occurring when there is no communication channel available in the trunk group associated with an incoming contact. |
static int |
BLOCKTYPE_QUEUEFULL
Contact blocking type occurring when the total queue capacity is exceeded upon the arrival of a contact. |
static int |
DEQUEUETYPE_BEGINSERVICE
Contact dequeueing type representing the beginning of the service. |
static int |
DEQUEUETYPE_FANTOM
Contact dequeue type used to remove multiple copies of a contact from waiting queues. |
static int |
DEQUEUETYPE_NOAGENT
Contact dequeuing type occurring when a waiting queue is cleared because there is no agent in the system capable of serving the contact. |
static int |
DEQUEUETYPE_TRANSFER
Contact dequeue type used when transferring a contact from a waiting to another waiting queue. |
protected int |
dqTypeRet
Contains the dequeue type used when a contact leaves a queue to enter a new one. |
Constructor Summary | |
---|---|
Router(int numTypes,
int numQueues,
int numGroups)
Constructs a new router with numTypes contact types, numQueues waiting queues, and numGroups agent groups. |
Method Summary | |
---|---|
void |
addExitedContactListener(ExitedContactListener listener)
Adds the exited-contact listener listener to this router. |
Iterator<AgentReroutingEvent> |
agentReroutingEventsIterator()
Constructs and returns an iterator for the agent rerouting events. |
protected void |
beginService(EndServiceEvent ev)
This method is called when the service of a contact, represented by the event ev, begins. |
abstract boolean |
canServe(int i,
int k)
Returns true if and only if some agents in group i are authorized to serve contacts of type k by this router. |
protected boolean |
checkFreeAgents(AgentGroup group,
Agent agent)
This method is called when the agent agent in agent group group becomes free. |
protected abstract void |
checkWaitingQueues(AgentGroup group)
This method is called when the agent group group contains no more online agents, i.e., AgentGroup.getNumAgents() returns 0. |
void |
clearExitedContactListeners()
Removes all the exited-contact listeners registered to this router. |
Iterator<ContactReroutingEvent> |
contactReroutingEventsIterator()
Constructs and returns an iterator for the contact rerouting events. |
protected void |
dequeued(DequeueEvent ev)
This method is called when a contact leaves a waiting queue, ev representing the corresponding dequeue event. |
protected void |
endContact(EndServiceEvent ev)
This method is called when the communication between a contact and an agent is finished. |
protected void |
endService(EndServiceEvent ev)
This method is called when the service (communication and after-contact work) of a contact in an agent group has ended. |
protected void |
enqueued(DequeueEvent ev)
This method is called when a contact is enqueued, ev representing the dequeue event. |
void |
exitBlocked(Contact contact,
int bType)
This method can be called when the contact contact was blocked by the router with blocking type bType. |
void |
exitDequeued(DequeueEvent ev)
This method must be called to notify that a contact exited the system after being dequeued, ev representing the dequeue event. |
void |
exitServed(EndServiceEvent ev)
This method must be called to notify a contact exiting the system after an end of service with end-service event ev. |
String |
formatAgentGroups()
Formats the connected agent groups as a string. |
String |
formatWaitingQueues()
Formats the connected waiting queues as a string. |
AgentGroup |
getAgentGroup(int i)
Returns the agent group with index i for this router. |
AgentGroupListener |
getAgentGroupListener()
Returns the agent-group listener registered with each agent group connected to this router. |
AgentGroup[] |
getAgentGroups()
Returns an array containing the agent groups attached to this router. |
Map<Agent,AgentReroutingEvent> |
getAgentReroutingEvents()
Returns an unmodifiable map containing the currently scheduled agent rerouting events. |
SingleTypeContactFactory |
getContactFactory(int k)
Returns the contact factory used by the simulator to create contacts of type k. |
Map<DequeueEvent,ContactReroutingEvent> |
getContactReroutingEvents()
Returns an unmodifiable map containing the currently scheduled contact rerouting events. |
int |
getCurrentQueueSize()
Returns the total number of contacts in the connected waiting queues. |
String |
getDescription()
|
List<Dialer> |
getDialers(int i)
Returns a list containing the dialers which will be triggered when the service of a contact by an agent in group i ends. |
List<ExitedContactListener> |
getExitedContactListeners()
Returns an unmodifiable list containing all the exited-contact listeners registered with this router. |
Comparator<? super DequeueEvent> |
getNeededWaitingQueueComparator(int q)
Determines how contacts in queue should be compared with each other for waiting queue q. |
WaitingQueueStructure |
getNeededWaitingQueueStructure(int q)
Returns the needed data structure for waiting queue with index q. |
int |
getNumAgentGroups()
Returns the number of agent groups supported by this router. |
int |
getNumContactTypes()
Returns the number of contact types supported by this router. |
int |
getNumWaitingQueues()
Returns the number of waiting queues supported by this router. |
protected double |
getReroutingDelay(Agent agent,
int numReroutingsDone)
Returns the delay, in simulation time units, after which an agent agent should try a new time to get a contact to serve. |
protected double |
getReroutingDelay(DequeueEvent dqEv,
int numReroutingsDone)
Returns the delay, in simulation time units, after which a queued contact should be rerouted. |
int |
getTotalQueueCapacity()
Returns the total capacity of the waiting queues for this router. |
WaitingQueue |
getWaitingQueue(int q)
Returns the waiting queue with index q for this router. |
WaitingQueueListener |
getWaitingQueueListener()
Returns the waiting-queue listener registered with each waiting queue connected to this router. |
WaitingQueue[] |
getWaitingQueues()
Returns an array containing the waiting queues attached to this router. |
WaitingQueueType |
getWaitingQueueType()
Returns an indicator describing how the implemented routing policies organizes waiting queues. |
void |
init()
This method is called at the beginning of the simulation to reset the state of this router. |
boolean |
isKeepingReroutingEvents()
Determines if this router keeps track of all rerouting events scheduled. |
boolean |
mustClearWaitingQueue(int q)
Determines if the router must clear the waiting queue q when all queued contacts cannot be served since no agent capable of serving them is online anymore. |
boolean |
needsDetailedAgentGroup(int i)
Determines if the agent group i should consider individual agents. |
void |
newContact(Contact contact)
This method is called when the new contact contact enters in the system and should not be overridden. |
void |
notifyBlocked(Contact contact,
int bType)
Notifies every registered listener that the contact contact was blocked with blocking type bType. |
void |
notifyDequeued(DequeueEvent ev)
Notifies every registered listener that a contact left the waiting queue, this event being represented by ev. |
void |
notifyServed(EndServiceEvent ev)
Notifies every registered listener that a contact was served, the service being represented by the end-service event ev. |
void |
removeExitedContactListener(ExitedContactListener listener)
Removes the exited-contact listener listener from this router. |
void |
restore(RouterState state)
Restores the state state of this router. |
RouterState |
save()
Saves the state of this router, and returns the resulting state object. |
protected abstract EndServiceEvent |
selectAgent(Contact contact)
Begins the service of the contact contact by trying to assign it a free agent. |
protected EndServiceEvent |
selectAgent(DequeueEvent dqEv,
int numReroutingsDone)
Selects an agent for serving a queued contact in the context of rerouting. |
protected DequeueEvent |
selectContact(AgentGroup group,
Agent agent)
Returns a dequeue event representing a queued contact to be served by the agent agent in agent group group. |
protected DequeueEvent |
selectContact(Agent agent,
int numReroutingsDone)
Selects a new contact for the agent agent, in the context of rerouting. |
protected abstract DequeueEvent |
selectWaitingQueue(Contact contact)
Selects a waiting queue and puts the contact contact into it. |
protected DequeueEvent |
selectWaitingQueue(DequeueEvent dqEv,
int numReroutingsDone)
Selects a waiting queue for a queued contact in the context of rerouting. |
void |
setAgentGroup(int i,
AgentGroup group)
Associates the agent group group with the index i in the router. |
void |
setClearWaitingQueue(int q,
boolean b)
Sets the clear-waiting-queue indicator for the waiting queue q to b. |
void |
setClearWaitingQueues(boolean b)
Sets the clear-waiting-queue indicator to b for all waiting queues. |
void |
setContactFactory(int k,
SingleTypeContactFactory factory)
Sets the contact factory used to create contacts of type k to factory. |
void |
setKeepingReroutingEvents(boolean keep)
Sets the keep-rerouting-events indicator to keep. |
void |
setTotalQueueCapacity(int capacity)
Sets the total queue capacity to capacity for this router. |
void |
setWaitingQueue(int q,
WaitingQueue queue)
Associates the waiting queue queue with the index q in the router. |
protected void |
startDialers(AgentGroup group)
Starts the dialers after the service of a contact by an agent in group group. |
String |
toLongString()
Returns a string representation of detailed information about the router. |
String |
toString()
|
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Field Detail |
---|
public static final int BLOCKTYPE_NOLINE
public static final int BLOCKTYPE_QUEUEFULL
public static final int BLOCKTYPE_CANTQUEUE
selectWaitingQueue(Contact)
returns null.
public static final int DEQUEUETYPE_BEGINSERVICE
public static final int DEQUEUETYPE_NOAGENT
public static int DEQUEUETYPE_FANTOM
public static int DEQUEUETYPE_TRANSFER
protected int dqTypeRet
Constructor Detail |
---|
public Router(int numTypes, int numQueues, int numGroups)
numTypes
- number of contact types.numQueues
- number of waiting queues.numGroups
- number of agent groups.
IllegalArgumentException
- if any argument is negative.Method Detail |
---|
public boolean isKeepingReroutingEvents()
public void setKeepingReroutingEvents(boolean keep)
keep
- the value of the indicator.public Iterator<ContactReroutingEvent> contactReroutingEventsIterator()
isKeepingReroutingEvents()
returns true, the iterator is
constructed from the set returned by getContactReroutingEvents()
.
Otherwise, an iterator traversing the event list and filtering the
appropriate events is constructed and returned.
public Map<DequeueEvent,ContactReroutingEvent> getContactReroutingEvents()
ContactReroutingEvent
. If rerouting events are not kept, this
throws an IllegalStateException
.
IllegalStateException
- if rerouting events are not kept.public Iterator<AgentReroutingEvent> agentReroutingEventsIterator()
isKeepingReroutingEvents()
returns true, the iterator is
constructed from the set returned by getAgentReroutingEvents()
.
Otherwise, an iterator traversing the event list and filtering the
appropriate events is constructed and returned.
public Map<Agent,AgentReroutingEvent> getAgentReroutingEvents()
Agent
object while each value corresponds to an instance of
AgentReroutingEvent
. If rerouting events are not kept, this
throws an IllegalStateException
.
IllegalStateException
- if rerouting events are not kept.public RouterState save()
public void restore(RouterState state)
state
- the saved state of the router.public int getTotalQueueCapacity()
public void setTotalQueueCapacity(int capacity)
IllegalArgumentException
is thrown.
If the capacity is less than the total number of queued contacts, this
throws an IllegalStateException
.
capacity
- the new total queue capacity.
IllegalArgumentException
- if the given capacity is negative.
IllegalStateException
- if the given capacity is less than the actual number of
queued contacts.public int getCurrentQueueSize()
public int getNumContactTypes()
public int getNumAgentGroups()
public int getNumWaitingQueues()
public WaitingQueue getWaitingQueue(int q)
WaitingQueue.getId()
method on the returned waiting queue should
return q, unless this method returns null.
q
- the index of the queue.
IndexOutOfBoundsException
- if q is negative or greater than or equal to
getNumWaitingQueues()
.public WaitingQueue[] getWaitingQueues()
public void setWaitingQueue(int q, WaitingQueue queue)
Note that some routers assume that waiting queues use FIFO discipline. In
this case, one should use StandardWaitingQueue
instances only.
Using PriorityWaitingQueue
may lead to routing not corresponding
to the defined policy.
q
- the index of the queue.queue
- the queue to be associated.
IllegalStateException
- if the queue id was already set to another value than
q.
IndexOutOfBoundsException
- if q is negative or greater than or equal to
getNumWaitingQueues()
.public boolean mustClearWaitingQueue(int q)
q
- the index of the checked waiting queue.
IndexOutOfBoundsException
- if q is negative or greater than or equal to
getNumWaitingQueues()
.public void setClearWaitingQueue(int q, boolean b)
mustClearWaitingQueue(int)
for more information.
q
- the index of the affected waiting queue.b
- the new value of the indicator.
IndexOutOfBoundsException
- if q is negative or greater than or equal to
getNumWaitingQueues()
.mustClearWaitingQueue(int)
public void setClearWaitingQueues(boolean b)
mustClearWaitingQueue(int)
for more information.
b
- the new value of the indicator.mustClearWaitingQueue(int)
public SingleTypeContactFactory getContactFactory(int k)
k
- the contact type identifier.
public void setContactFactory(int k, SingleTypeContactFactory factory)
k
- the contact type identifier.factory
- the contact factory.public AgentGroup getAgentGroup(int i)
AgentGroup.getId()
on the
returned group should return i, unless this method returns
null.
i
- the index of the agent group.
IndexOutOfBoundsException
- if i is negative or greater than or equal to
getNumAgentGroups()
.public AgentGroup[] getAgentGroups()
public void setAgentGroup(int i, AgentGroup group)
i
- the index of the agent group.group
- the agent group to be associated.
IllegalStateException
- if the group id was already set to another value than
i.
IndexOutOfBoundsException
- if i is negative or greater than or equal to
getNumAgentGroups()
.public List<Dialer> getDialers(int i)
Dialer
class, should be used instead of an agent-group listener to activate the
dialer. As opposed to an agent-group listener requesting dialers to try
calls, dialers in the returned list are activated only after contact
selection for agents in group i is done, and they are guaranteed
to be activated in the order given by the list.
i
- the index of the agent group.
ArrayIndexOutOfBoundsException
- if the agent group index is out of bounds.public abstract boolean canServe(int i, int k)
i
- the agent group index.k
- the contact type index.
public boolean needsDetailedAgentGroup(int i)
getAgentGroup(int)
is implemented. This method only gives clues to a
simulator on how to construct the concerned
agent group.
i
- the index of the agent group.
public WaitingQueueType getWaitingQueueType()
WaitingQueueType.GENERAL
must be used.
By default, this method returns WaitingQueueType.GENERAL
.
public WaitingQueueStructure getNeededWaitingQueueStructure(int q)
getWaitingQueue(int)
.
By default, this returns WaitingQueueStructure.LIST
.
q
- the index of the waiting queue.
public Comparator<? super DequeueEvent> getNeededWaitingQueueComparator(int q)
getNeededWaitingQueueStructure(int)
returns
WaitingQueueStructure.SORTEDSET
or
WaitingQueueStructure.PRIORITY
.
By default, this returns null.
q
- the index of the waiting queue.
public void newContact(Contact contact)
Contact.setRouter(Router)
method
is first used to set the router of the new contact to this object. Then,
if Contact.getTrunkGroup()
returns a non-null value, a
communication channel is allocated. If no communication channel is
available for the contact, the contact is blocked with blocking type
BLOCKTYPE_NOLINE
. If the contact has no associated trunk group
or if a communication channel could be successfully allocated, the
selectAgent(Contact)
method is called to try to assign it an agent. In
case of failure, i.e., selectAgent(Contact)
returns null, the
router tries to queue the contact. If the total queue size is equal to the
total queue capacity, or if selectWaitingQueue(Contact)
returns
null, the contact is blocked with blocking type
BLOCKTYPE_QUEUEFULL
or BLOCKTYPE_CANTQUEUE
,
respectively.
newContact
in interface NewContactListener
contact
- the arrived contact.
IllegalStateException
- if Contact.getRouter()
returns a non-null
value before the router is set.
IllegalArgumentException
- if the contact type identifier of the contact is negative or
greater than or equal to getNumContactTypes()
.public void addExitedContactListener(ExitedContactListener listener)
listener
- the listener being added.
NullPointerException
- if listener is null.public void removeExitedContactListener(ExitedContactListener listener)
listener
- the exited contact listener being removed.public void clearExitedContactListeners()
public List<ExitedContactListener> getExitedContactListeners()
public void notifyBlocked(Contact contact, int bType)
contact
- the blocked contact.bType
- the blocking type.public void notifyDequeued(DequeueEvent ev)
ev
- the event representing the contact having left the queue.public void notifyServed(EndServiceEvent ev)
ev
- the end-service event representing
the end of the service.public void exitServed(EndServiceEvent ev)
ev
- the end-service event.public void exitDequeued(DequeueEvent ev)
ev
- the dequeue event.public void exitBlocked(Contact contact, int bType)
BLOCKTYPE_NOLINE
value is
reserved for the special case where there is no available communication
channel for the contact.
contact
- the contact being blocked.bType
- the blocking type.protected void startDialers(AgentGroup group)
checkFreeAgents(AgentGroup,Agent)
and
should call the Dialer.dial()
method on one or more dialers. The
default implementation starts all the dialers in the list
getDialers
(group.getId()).
group
- the agent group being notified.public void init()
protected abstract EndServiceEvent selectAgent(Contact contact)
contact
- the contact being routed to an agent.
protected EndServiceEvent selectAgent(DequeueEvent dqEv, int numReroutingsDone)
dqEv
- the dequeue event representing the queued contact.numReroutingsDone
- the number of preceding reroutings.
protected abstract DequeueEvent selectWaitingQueue(Contact contact)
contact
- the contact being queued.
protected DequeueEvent selectWaitingQueue(DequeueEvent dqEv, int numReroutingsDone)
dqTypeRet
field to store the dequeue type of the contact leaving
the queue.
dqEv
- the dequeue event representing the queued contact.numReroutingsDone
- the number of preceding reroutings.
protected boolean checkFreeAgents(AgentGroup group, Agent agent)
DEQUEUETYPE_BEGINSERVICE
before
they are transferred to agents.
The method returns true if and only if at least one
free agent could be made busy.
The default implementation calls selectContact(AgentGroup,Agent)
to get a new
dequeue event representing the
removed contact, extracts the contact,
and routes it to an agent, until group has no
more free agent.
group
- the affected agent group.agent
- the agent having ended its service.
protected DequeueEvent selectContact(AgentGroup group, Agent agent)
DEQUEUETYPE_BEGINSERVICE
, e.g., by using
queue.removeFirst (DEQUEUETYPE_BEGINSERVICE)
, or
queue.remove (ev, DEQUEUETYPE_BEGINSERVICE)
,
etc.
Generally, it is sufficient
to override this method instead of checkFreeAgents(AgentGroup,Agent)
. One can
override checkFreeAgents(AgentGroup,Agent)
to improve efficiency when looking for
contacts in the same waiting queue. This method is not abstract and
returns null by default in order to allow
checkFreeAgents(AgentGroup,Agent)
to be overridden without implementing this
method.
group
- the affected agent group.agent
- the agent having ended its service.
protected DequeueEvent selectContact(Agent agent, int numReroutingsDone)
agent
- the affected agent.numReroutingsDone
- the number of preceding reroutings.
protected abstract void checkWaitingQueues(AgentGroup group)
AgentGroup.getNumAgents()
returns 0. It must
check each waiting queue accessible for agents in this group to determine
if they need to be cleared. A queue is cleared if no agent, whether free
or busy, is available to serve any contact in it.
group
- the agent group with no more agents.protected double getReroutingDelay(DequeueEvent dqEv, int numReroutingsDone)
Double.POSITIVE_INFINITY
.
dqEv
- the dequeue event representing the queued contact.numReroutingsDone
- the number of reroutings so far.
protected double getReroutingDelay(Agent agent, int numReroutingsDone)
Double.POSITIVE_INFINITY
.
agent
- the idle agent, or null.numReroutingsDone
- the number of previous reroutings for the agent.
protected void beginService(EndServiceEvent ev)
ev
- the end-service event.protected void endContact(EndServiceEvent ev)
exitServed(EndServiceEvent)
.
ev
- the end-service event.protected void endService(EndServiceEvent ev)
ev
- the end-service event.protected void enqueued(DequeueEvent ev)
ev
- the dequeue event.protected void dequeued(DequeueEvent ev)
exitDequeued(DequeueEvent)
.
This method should not notify an exiting contact for a 0 dequeue type
since it is reserved for queued and served contacts.
ev
- the dequeue event.public String formatWaitingQueues()
public String formatAgentGroups()
public WaitingQueueListener getWaitingQueueListener()
public AgentGroupListener getAgentGroupListener()
public String getDescription()
public String toString()
toString
in class Object
public String toLongString()
toString()
should be used.
|
ContactCenters V. 0.9.9. |
||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |