SNMP コマンドを送信し、トラップをリッスンするプログラムがあります。
私の最初の方法は、SNMP の送信を調整します。彼が送信を完了したら、トラップを受信したという通知を受信するまで待って、実行を継続できるようにする必要があります。現在、グローバル オブジェクトを同期することでそれを実行しようとしていますが、うまくいかず、それが私にとって理想的な解決策であるかどうかはわかりません。
public synchronized int loginUser(ScopedPDU pdu) throws IOException
{
loginUserManager = new LoginUserManager();
pdu = buildPdu();
// send command
errorStatus = snmpManager.snmpSend(pdu);
if (errorStatus == SnmpManager.SNMP_PASS)
{
// Wait for traps
synchronized(syncObject)
{
// read global variable status to see if it's no longer in progress
while(status == TrapStatus.INPROGRESS)
{
try {
System.out.println("Waiting for login to be done");
syncObject.wait();
System.out.println("We received a notify");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} //(errorStatus == SnmpManager.SNMP_PASS)
else
{
return TrapStatus.FAIL;
}
System.out.println("Returning status");
return status;
}
私の 2 番目の方法はトラップを受信し (そして最初の方法とは別のスレッドで実行され)、必要な正しいステータスを取得していますが、他のスレッドに通知することはできません。
public synchronized void readTrap(Vector v)
{
Enumeration e = v.elements();
if(v.contains(PduTrap.UserLoginStatusTrap))
{
// gets status of login
status = loginUserManager.getStatus(e);
synchronized(syncObject)
{
// notify first method to read the new status
syncObject.notify();
}
}
}
status と SyncObject は、スレッド間で共有しようとしているグローバル タイプです。クラス コンストラクターでステータスを INPROGRESS に初期化します。
private int status;
private Object syncObject;
なぜ物事がうまくいかないのか、または私がこれを完全に間違った方法で行っているのか、誰か教えていただけますか? 現在、私の loginUser メソッドは readTrap によって通知されていません。ありがとうございました