关闭

SNMP4J开发trap监听实例

标签: import测试多线程commandstringclass
7762人阅读 评论(3) 收藏 举报
分类:
/**
 * 测试snmp4j 中trap的接收方法.这里只测试了v1和v2的trap.
 * trap接收原理:snmp实例在注册了实现CommandResponder的listener之后,可以通过异步调用的方法
    * 将收到内容输出.
 * listen()启动监听线程,该线程中的操作是监听指定端口,在收到trap告警之后将调用
 * listener.processPdu(CommandResponderEvent event)方法,由processPdu来处理trap信息.
 
*/

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();
        }

    }

}


/*
运行结果如下:
start listening!
true
V1TRAP[reqestID=0,timestamp=0:00:00.00,enterprise=0.0,genericTrap=2,specificTrap=0, VBS[]]
V1TRAP[reqestID=0,timestamp=0:00:00.00,enterprise=0.0,genericTrap=2,specificTrap=0, VBS[]]
TRAP[requestID=1762734632, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.2.1.1.3.0 = 0:00:00.00; 1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.6.3.1.1.5.3]]
TRAP[requestID=1762734633, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.2.1.1.3.0 = 0:00:00.00; 1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.6.3.1.1.5.3]]
TRAP[requestID=1762734634, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.2.1.1.3.0 = 0:00:00.00; 1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.6.3.1.1.5.3]]
TRAP[requestID=1762734635, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.2.1.1.3.0 = 0:00:01.11; 1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.6.3.1.1.5.3]]

这里测试发送了6条trap,第1,2条为v1trap,第3,4,5,6条为v2trap.最后一条时间稍有改变.
trap的输出的内容就这些,具体内容按照实际情况而定.
*/
 
这里有个问题,我没有做测试:
在收到第一个trap信息后处理该trap消息,如果不采用多线程处理该trap消息,将会导致在trap处理时间内发送过来的另一个trap消无法接收而丢失.具体有无采用多线程处理可以通过测试得出.如果没采用多线程处理,那么有必要在processPdu方法中使用线程来处理该trap事件.
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    文章分类
    最新评论