Search in sources :

Example 1 with AgentSessionList

use of org.jivesoftware.xmpp.workgroup.AgentSessionList in project Openfire by igniterealtime.

the class RoundRobinDispatcher method getBestNextAgent.

/**
     * <p>Locate the next 'best' agent to receive an offer.</p>
     * <p>Routing is based on show-status, max-chats, and who has
     * already rejected the offer.
     * show status is ranked from most available to least:
     * chat, default (no show status), away,
     * and xa. A show status of dnd indicates no offers should be routed to an agent.
     * The general algorithm is:</p>
     * <ul>
     * <li>Mark the current position.</li>
     * <li>Start iterating around the circular queue until all agents
     * have been considered. For each agent:
     * <ul>
     * <li>Skip if session is null. Should only occur if no agents are in the list.</li>
     * <li>Skip if session show state is DND. Never route to agents that are dnd.</li>
     * <li>Skip if session current-chats is equal to or higher than max-chats.</li>
     * <li>Replace current best if:
     * <ul>
     * <li>No current best. Any agent is better than none.</li>
     * <li>If session hasn't rejected offer but current best has.</li>
     * <li>If both session and current best have not rejected the
     * offer and session show-status is higher.</li>
     * <li>If both session and current best have rejected offer and
     * session show-status is higher.</li>
     * </ul></li>
     * </ul></li>
     * </li>
     *
     * @param initialAgent the initial agent requested by the user.
     * @param ignoreAgent agent that should not be considered as available.
     * @param offer the offer about to be sent to the best available agent.
     * @return the best agent.
     */
private AgentSession getBestNextAgent(String initialAgent, String ignoreAgent, Offer offer) {
    AgentSession bestSession;
    // Look for specified agent in agent list
    if (initialAgent != null) {
        final AgentSessionList agentSessionList = queue.getAgentSessionList();
        for (AgentSession agentSession : agentSessionList.getAgentSessions()) {
            String sessionAgent = agentSession.getAgent().getAgentJID().toBareJID();
            boolean match = sessionAgent.startsWith(initialAgent.toLowerCase());
            Workgroup workgroup = offer.getRequest().getWorkgroup();
            if (agentSession.isAvailableToChat() && agentSession.getCurrentChats(workgroup) < agentSession.getMaxChats(workgroup) && match) {
                bestSession = agentSession;
                // Log debug trace
                Log.debug("RR - Initial agent: " + bestSession.getJID() + " will receive offer for request: " + offer.getRequest());
                return bestSession;
            }
        }
    }
    // Let's iterate through each agent and check availability
    final AgentSessionList agentSessionList = queue.getAgentSessionList();
    final List<AgentSession> possibleSessions = new ArrayList<AgentSession>();
    for (AgentSession agentSession : agentSessionList.getAgentSessions()) {
        String sessionAgent = agentSession.getAgent().getAgentJID().toBareJID();
        boolean ignore = ignoreAgent != null && sessionAgent.startsWith(ignoreAgent.toLowerCase());
        if (!ignore && validateAgent(agentSession, offer)) {
            possibleSessions.add(agentSession);
        }
    }
    // Select the best agent from the list of possible agents
    if (possibleSessions.size() > 0) {
        AgentSession s = agentSelector.bestAgentFrom(possibleSessions, offer);
        // Log debug trace
        Log.debug("RR - Agent SELECTED: " + s.getJID() + " for receiving offer for request: " + offer.getRequest());
        return s;
    }
    return null;
}
Also used : AgentSession(org.jivesoftware.xmpp.workgroup.AgentSession) AgentSessionList(org.jivesoftware.xmpp.workgroup.AgentSessionList) ArrayList(java.util.ArrayList) Workgroup(org.jivesoftware.xmpp.workgroup.Workgroup)

Example 2 with AgentSessionList

use of org.jivesoftware.xmpp.workgroup.AgentSessionList in project Openfire by igniterealtime.

the class RoundRobinDispatcher method fillAgentsList.

/**
     * <p>Generate the agents offer list.</p>
     */
private void fillAgentsList() {
    AgentSessionList agentSessionList = queue.getAgentSessionList();
    agentSessionList.addAgentSessionListener(this);
    for (AgentSession agentSession : agentSessionList.getAgentSessions()) {
        if (!agentList.contains(agentSession)) {
            agentList.add(agentSession);
        }
    }
}
Also used : AgentSession(org.jivesoftware.xmpp.workgroup.AgentSession) AgentSessionList(org.jivesoftware.xmpp.workgroup.AgentSessionList)

Aggregations

AgentSession (org.jivesoftware.xmpp.workgroup.AgentSession)2 AgentSessionList (org.jivesoftware.xmpp.workgroup.AgentSessionList)2 ArrayList (java.util.ArrayList)1 Workgroup (org.jivesoftware.xmpp.workgroup.Workgroup)1