openfire 插件fastpath

fastpath的介紹: html

1.提供了Workgroup協議的實現,Workgroup的概念就是專門對應在線客服這個典型場景了。這是企業或組織機構的客服需求的核心概念和功能,相似於呼叫中心。
2.Server端的歷史記錄存儲。默認Openfire自己是不記錄信息歷史記錄的,只記錄離線留言。注意,離線消息和消息歷史記錄是兩個不一樣的概念,離線消息是對方不在線的狀況,server端先保存起來,等對方上線後再發給他,發完了消息在server端就被刪除了;而消息歷史記錄是隻server端記錄的全部對話消息,固然客戶端也能夠實如今客戶端上本身的歷史記錄。

fasthpath:主要分爲兩端:agent-客服,user-用戶,爲人工客服實現了排隊路由等基本的呼叫中心功能。
fasthpath:實現的原理就是以技能組爲標準對用戶加入對應的技能組在路由給對應技能組的客服人員,客服人員收到offer以後,能夠接受,fastpath就能夠建立openfire的聊天室邀請用戶和agent加入進來進行會話,實現客服功能。其中fastpath還提供了一些其餘的附加功能:好比轉接,路由過程指定客服,設置最大聊天室等等,這些功能能夠再之後開發過程當中有須要的狀況下查看源碼便可瞭解。
下面給出最簡單的:user去排隊,客服加入技能組,來顯示整個的客服功能。

這是openfire提供的插件,在smack中也提供了對應的api,這裏提供一個agent端的實例 java

/**
	 * 加入技能組
	 * @param workGroupName
	 * @return
	 */
	public boolean joinWorkGroup(String workGroupName,int maxChats){
		boolean bResult=false;
		agentSession=new AgentSession(workGroupName,connection);
		agentSession.addInvitationListener(new WorkgroupInvitationListener(){
			public void invitationReceived(WorkgroupInvitation workgroupInvitation) {
//				System.out.println("workgroupInvitation.getWorkgroupName():"+workgroupInvitation.getWorkgroupName());
//				System.out.println("workgroupInvitation.getMessageBody():"+workgroupInvitation.getMessageBody());
//				System.out.println("workgroupInvitation.getMetaData():"+workgroupInvitation.getMetaData());
//				System.out.println("workgroupInvitation.getInvitationSender():"+workgroupInvitation.getInvitationSender());
//				System.out.println("workgroupInvitation.getGroupChatName():"+workgroupInvitation.getGroupChatName());
				joinRoom(workgroupInvitation.getGroupChatName());
//				System.out.println("name:"+workgroupInvitation.getGroupChatName()+",id:"+workgroupInvitation.getSessionID());
				/*try {
					agentSession.sendRoomTransfer(RoomTransfer.Type.user, "10110@kfas1", workgroupInvitation.getSessionID(), "轉接");
				} catch (XMPPException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}*/
			}
			
		});
		agentSession.addOfferListener(new OfferListener(){

			public void offerReceived(Offer offer) {
				System.out.println("offer.getUserJID();"+offer.getUserJID());
				System.out.println("offer.getContent();"+offer.getContent());
				offer.accept();
			}

			public void offerRevoked(RevokedOffer revokedOffer) {
				System.out.println("revokedOffer.getReason():"+revokedOffer.getReason());
				System.out.println("revokedOffer.getUserJID():"+revokedOffer.getUserJID());
            }
			
		});
		agentSession.addQueueUsersListener(new QueueUsersListener(){

			public void averageWaitTimeUpdated(WorkgroupQueue workgroupQueue, int averageWaitTime) {
//				System.out.println("averageWaitTime:"+averageWaitTime);
//				System.out.println("workgroupQueue.getAverageWaitTime():"+workgroupQueue.getAverageWaitTime());
//				System.out.println("workgroupQueue.getCurrentChats():"+workgroupQueue.getCurrentChats());
//				
			}

			public void oldestEntryUpdated(WorkgroupQueue workgroupQueue, Date oldestEntry) {
//				System.out.println("oldestEntry:"+oldestEntry.toString());
				
			}

			public void statusUpdated(WorkgroupQueue workgroupQueue, Status status) {
//				System.out.println("status:"+status.toString());
				
			}

			public void usersUpdated(WorkgroupQueue workgroupQueue, Set uers) {
				for (Iterator iterator = uers.iterator(); iterator
						.hasNext();) {
					Object user = (Object) iterator.next();
					System.out.println("user:"+user.toString());
					
				}
				
			}
			
		});
	    try {
			agentSession.setOnline(true);
			/*Presence presence=new Presence(Presence.Type.available);
			presence.setTo("demo@workgroup.kftest2");
			presence.setPriority(1);
			connection.sendPacket(presence);
			System.out.println("presence OK");*/
			agentSession.setStatus(Presence.Mode.available,maxChats,"OK");
			System.out.println(agentSession.getMaxChats());
		} catch (XMPPException e) {
			e.printStackTrace();
		}
		
		bResult=true;
		return bResult;
	}


用戶user端的加入排隊實例,也是基於smack包編寫,能夠發現smack都提供了對應的對象進行編程: 編程

public void joinQueue(String workgroupName, Map metaData) {
    	workgroup = new Workgroup(workgroupName, connection);
    	//監聽技能組中隊列的事件
    	//這裏監聽,因爲workGroup監聽connection的包,若是第二次初始化,第一次的隊列的監聽還會觸發
    	this.listenForQueue();
    	
    	workgroupInvitationListener = new WorkgroupInvitationListener(){ 
    		public void invitationReceived(WorkgroupInvitation workgroupInvitation) {
	            String room = workgroupInvitation.getGroupChatName();
	            joinRoom(room);
    		}
		};
    	workgroup.addInvitationListener(workgroupInvitationListener);
    	
        if (workgroup != null) {
            try {
            	workgroup.joinQueue(metaData, userid);
            } catch (XMPPException e) {
            	//異常的狀況也繼續排隊,因爲技能沒有agent會service-unavailable(503)
            	log.error("[>"+callInfo.getJid()+"<]: Unable to join chat queue.",e);
            }
        }
    }
    
    
    /**
     * 監聽隊列狀況
     *
     */
    public void listenForQueue(){
    	queueListener =new QueueListener(){
			//加入隊列成功返回基礎消息
			public void joinedQueue() {
				
            }

   		 	//離開隊列事件
            public void departedQueue() {
            }
            
            //隊列位置變化
            public void queuePositionUpdated(int currentPosition) {
            }

            //隊列時間變化
            public void queueWaitTimeUpdated(int secondsRemaining) {
            }
		};
    	workgroup.addQueueListener(queueListener);
    }
相關文章
相關標籤/搜索