使用Java應(yīng)用程序快速實(shí)現(xiàn)自己的專用IVR 
 2009/06/04
1.涉及的組件
  Jcom.jar
                  2.應(yīng)用環(huán)境
  使用Java Application開發(fā)固定流程的IVR。 
                  3.目標(biāo)功能
  來(lái)話后放音,放音完成后掛機(jī)。
                  4.主要代碼片段
///////////////////////////////////////////////////////////////////////////////
Part 1: 主處理類
package examples;
import lioncen.cti.jcom.engine.*;
import lioncen.cti.jcom.object.*;
import java.awt.*;
import java.awt.event.*;
/**
 * 全局事件處理器
 * 從CTIEventAdapter繼承,用來(lái)實(shí)現(xiàn)CTI全局消息處理
 */
class MyCTIEventHandler extends CTIEventAdapter
{
	/**
	 * 來(lái)話通知,產(chǎn)生單獨(dú)的線程去處理邏輯
	 */
	public void callIncome(int pid, CALL call, String ano, String bno)
	{
		SCPMANAGER.ctiLog.Debug("MainEventHandler",  
"PID=" + pid + " CallIncome: Ano=" + ano 
+ " Bno=" + bno + " CallID=" + call.callID);
		
		JComDemoThread teleThd = new JComDemoThread(call);
		teleThd.start();
	}
	/**
	 * 掛機(jī)通知,輸出日志
	 */
	public void callEnd(int pid, CALL call)
	{
		SCPMANAGER.ctiLog.Debug("MainEventHandler", 
"PID=" + pid + " CallEnd: CallID=" + call.callID);
	}
}
/**  主處理類,應(yīng)用入口
*  收到來(lái)話事件后,產(chǎn)生單獨(dú)的處理線程處理話務(wù)邏輯
 */
public class JComTest
{
	//定義靜態(tài)的管理器對(duì)象
	static SCPMANAGER mgr = new SCPMANAGER();
	public static void main(String Args[])
	{
		Frame mywin = new Frame("JCom Test");
		mywin.setSize(300, 300);
		mywin.setBackground(Color.BLUE);
		mywin.setVisible(true);
		mywin.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				SCPMANAGER.ctiEngine.stop();
				SCPMANAGER.ctiLog.Notify("Main", "程序正常退出");
				System.exit(0);
			}
		});
		
		//設(shè)置管理器對(duì)象的消息處理器
		mgr.ctiEventListener = new MyCTIEventHandler();
	}
}
///////////////////////////////////////////////////////////////////
Part 2: 電話處理線程類
package examples;
import lioncen.cti.jcom.*;
import lioncen.cti.jcom.object.*;
import lioncen.cti.jcom.engine.*;
/**
 * 線程事件處理函數(shù)
* 從CTIThreadEventAdapter繼承,用來(lái)實(shí)現(xiàn)線程消息處理
*
 */
class MyThreadEventHandler extends CTIThreadEventAdapter
{
	/**
	 * 來(lái)話通知
	 */
	public void callIncome(CTITeleThread thd, CALL call, String ano, String bno)
	{
		SCPMANAGER.ctiLog.Debug("ThreadEventHandler", "PID=" + thd.processID 
				+ " CallIncome: Ano=" + ano + " Bno=" + bno);
	}
	/**
	 * 掛機(jī)通知
	 */
	public void callEnd(CTITeleThread thd, CALL call)
	{
		SCPMANAGER.ctiLog.Debug("ThreadEventHandler", "PID=" + thd.processID 
				+ " CallEnd: CallID=" + call.callID);
		thd.terminate = true;
	}
	
	// 其它消息與本例子無(wú)關(guān),請(qǐng)參考JCOM API
	
}
/**
* 
 *  處理電話邏輯的線程類
 *   一個(gè)簡(jiǎn)單的例子
 *   收到電話后應(yīng)答,并開始循環(huán)播放Welcome.vox文件,播放30秒后掛機(jī)
 */
public class JComDemoThread extends CTITeleThread
{
	public JComDemoThread(CALL call)
	{
		//構(gòu)造基類
		super(call);
		//設(shè)置線程中管理器對(duì)象對(duì)應(yīng)的時(shí)間處理器
		thdSCPManager.thdEventListener = new MyThreadEventHandler();
	}
	
	public void Sleep(int msec)
	{
		try
		{
			sleep(msec);
		}
		catch (InterruptedException e)
		{
		}
	}
	
	public void run()
	{
		//應(yīng)答電話
		int ret = originalCall.answer();
		if (ret == CTIConst.RET_FAIL)
		{
			System.out.println("應(yīng)答失敗");
			return;
		}
	
		//設(shè)置關(guān)聯(lián)的線程ID,后續(xù)關(guān)于此線程的消息將直接通知線程
		originalCall.attachProcessID(processID);
		//顯示來(lái)話信息
		System.out.println("來(lái)話:主叫=" 
				+ originalCall.getAno() 
				+ " 被叫=" + originalCall.getBno() 
				+ " 時(shí)間=" + originalCall.getOccurTime());
		//循環(huán)異步放音,播放CTI服務(wù)器上的D:\\vox\\welcome.vox文件
		int taskid = originalCall.play(true, true, "D:\\vox\\welcome.vox");
		//放音等待30秒
		Sleep(30000);
		
		//停止放音
		originalCall.stopOP(taskid);
		//掛機(jī)
		originalCall.onHook();
		
		//等待掛機(jī)消息,掛機(jī)消息處理函數(shù)中設(shè)置terminate為true
		while (terminate == false)
		{
			Sleep(1000);
		}
		
		//線程清理,很重要!
		finalize();
	}
}
CTI論壇報(bào)道
 相關(guān)鏈接: