-1

以下のコードを使用して電話のステータスを確認しています(電話が稼働中か停止中か)。電話がダウンすると、アラームが送信されます。ただし、これは 8800 シリーズの電話機がダウンしている場合には表示されません。電話の登録/登録解除のステータスを確認する他の方法はありますか?

@Override public void terminalChangedEvent(TermEv[] eventList) {
        if ( eventList != null ) {
            for (TermEv eventList1 : eventList) {
                 if (eventList1 instanceof CiscoTermInServiceEv){
                    if(terminalInService.test()==true){
                        LogSQL.removeLog(terminal.getName());
                     }
                    System.out.println(terminal.getName());
                    terminalInService.set();
                    return;
                } else if (eventList1 instanceof CiscoTermOutOfServiceEv && 
                    terminalInService.test()==true) {
                    offline();
                }
            }
         }
       }

2 番目の質問です。「com.cisco.cti.util.Condition」クラスに関するメソッドまたはドキュメントを見つけることができませんでした。Condition.set() および Condition.test() メソッドは何をしますか?

4

1 に答える 1

0

あなたは正しい一般的な考えを持っているようです - 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

于 2018-03-06T19:36:35.250 に答える