あなたは正しい一般的な考えを持っているようです - JTAPI は 88xx モデルでうまく動作するはずです. 88xx)。
CUCM 11.5 で動作する私のバージョンは次のとおりです。
package com.mycompany.app;
import com.cisco.jtapi.extensions.*;
import java.util.*;
import javax.telephony.*;
import javax.telephony.events.*;
import javax.telephony.callcontrol.*;
import javax.telephony.callcontrol.events.*;
import com.cisco.cti.util.Condition;
public class DataTerm implements ProviderObserver, TerminalObserver {
public static final int OUT_OF_SERVICE = 0;
public static final int IN_SERVICE = 1;
private Address destAddress;
private CiscoTerminal observedTerminal;
private boolean addressInService;
private boolean terminalInService;
protected int state = OUT_OF_SERVICE;
Condition conditionInService = new Condition();
Provider provider;
public DataTerm(String[] args) {
try {
System.out.println("Initializing Jtapi");
String providerName = "ds-ucm115-1.cisco.com";
String login = "dstaudt";
String passwd = "password";
String dest = "2999";
JtapiPeer peer = JtapiPeerFactory.getJtapiPeer(null);
String providerString = providerName + ";login=" + login + ";passwd=" + passwd;
System.out.println("Opening " + providerString + "...\n");
provider = peer.getProvider(providerString);
provider.addObserver(this);
conditionInService.waitTrue();
this.destAddress = provider.getAddress(dest);
this.observedTerminal = (CiscoTerminal) destAddress.getTerminals()[0];
try {
if (destAddress != null) {
System.out.println("Adding Terminal Observer to Terminal" + observedTerminal.getName());
observedTerminal.addObserver(this);
}
} catch (Exception e) {
}
} catch (Exception e) {
System.out.println("Caught exception " + e);
}
}
public void terminalChangedEvent(TermEv[] events) {
for (int i = 0; i < events.length; i++) {
Terminal terminal = events[i].getTerminal();
switch (events[i].getID()) {
case CiscoTermInServiceEv.ID:
System.out.println("Received " + events[i] + "for " + terminal.getName());
terminalInService = true;
break;
case CiscoTermOutOfServiceEv.ID:
System.out.println("Received " + events[i] + "for " + terminal.getName());
terminalInService = false;
if (state != OUT_OF_SERVICE) { // you only want to notify when you had notified earlier that you are IN_SERVICE
state = OUT_OF_SERVICE;
}
break;
}
}
}
public void providerChangedEvent(ProvEv[] eventList) {
if (eventList != null) {
for (int i = 0; i < eventList.length; i++) {
if (eventList[i] instanceof ProvInServiceEv) {
conditionInService.set();
}
}
}
}
}
「com.cisco.cti.util.Condition」は、次のパターンに基づいているようです。
public インターフェイス 条件
条件は、オブジェクト モニター メソッド (wait、notify、および notifyAll) を個別のオブジェクトに分解して、オブジェクトごとに複数の待機セットを持つ効果を与えます。これらを任意の Lock 実装の使用と組み合わせます。Lock が同期されたメソッドとステートメントの使用に置き換わる場合、Condition はオブジェクト モニター メソッドの使用に置き換わります。
条件 (条件キューまたは条件変数とも呼ばれます) は、ある状態条件が真である可能性があることを別のスレッドから通知されるまで、あるスレッドが実行を中断する (「待機する」) 手段を提供します。この共有状態情報へのアクセスは異なるスレッドで発生するため、保護する必要があり、何らかの形式のロックが条件に関連付けられます。条件の待機が提供する重要な特性は、関連付けられたロックをアトミックに解放し、Object.wait と同様に現在のスレッドを一時停止することです。
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html