
import org.snmp4j.CommandResponder;
import org.snmp4j.CommandResponderEvent;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class TrapTest ... {
public static void main(String[] args)...{
try ...{
//snmp4j通過transportmapping的監聽端口接收SNMP資訊,是以這裡初始化一個
//transportmapping,
//注明本機的IP位址及接收trap的端口.
TransportMapping transport = new DefaultUdpTransportMapping(new UdpAddress("127.0.0.1/162"));
//建立一個處理消息的snmp執行個體
Snmp snmp = new Snmp(transport);
//CommandResponder是一個listener,用以處理擷取的trap消息
CommandResponder trapPrinter = new CommandResponder()...{
public synchronized void processPdu(CommandResponderEvent e)...{
PDU command = e.getPDU();
if(command!=null)...{
//這裡示例輸出trap的内容.具體的trap解析等工作在這裡進行.
System.out.println(command.toString());
}
}
};
//在snmp執行個體中添加CommandResponder listener
snmp.addCommandResponder(trapPrinter);
System.out.println("start listening!");
//開始啟動trap監聽.listen()方法内部啟動了一個線程,這個線程監聽發送到transport中定義的端口
//的消息.
transport.listen();
System.out.println(transport.isListening());//測試監聽是否正常
//等待一段測試時間,在這段時間可以發送trap資訊測試.
Thread.sleep(180000);
} catch (Exception e) ...{
e.printStackTrace();
}
}
}

這裡有個問題,我沒有做測試:
在收到第一個trap資訊後處理該trap消息,如果不采用多線程處理該trap消息,将會導緻在trap處理時間内發送過來的另一個trap消無法接收而丢失.具體有無采用多線程處理可以通過測試得出.如果沒采用多線程處理,那麼有必要在processPdu方法中使用線程來處理該trap事件.