有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Apache Camel SNMP组件

目前,我正在从事一个项目,在该项目中,我接收OPC UA数据,并通过SNMP将其发送到PRTG监控系统。我已经创建了OPC UA数据点和SNMP客户端(具有唯一OID)之间的路由。这里的问题是与PRTG监控系统的连接。当我启动连接时,我在SnmpTrapProducer上得到一个空指针异常。似乎我无法在SNMPTrap Producer中创建PDU类型的陷阱。爪哇

我发现在SNMPTRAP中创建的PDU陷阱。process(Exchange)返回NullPointerException(可以在图中看到类的各个部分)。我尝试了不同的方法,比如改变消息体类型、不同的端口以及ip地址。但我仍然得到NullPointerException

我需要配置什么,这样陷阱就不会返回null指针异常

Image of parts of the code

snmptproducer。java

...
PDU trap = exchange.getIn().getBody(PDU.class);

trap.setErrorIndex(0);
trap.setErrorStatus(0);
trap.setMaxRepetitions(0);
...

以下代码是驼峰路线的配置

from("milo-client:opc.tcp://"
                + OpcConfiguration.getIpAdress() + ":"
                + OpcConfiguration.getPort()
                + "?node=RAW(" + snmpOidDataStructure.getOpcDataStructure().getNodeId() + ")&allowedSecurityPolicies=None")
                .to("stream:out")
                .to("snmp://10.3.248.12:5700?protocol=udp&type=TRAP&snmpVersion=1&oids=" + snmpOidDataStructure.getOid());

OPC组件的消息体如下所示:

{value=Variant{value=[LocalizedText{text=CP, locale=de}, LocalizedText{text=Video, locale=de}, LocalizedText{text=Notfallsäule, locale=de}, LocalizedText{text=CP Notruf 2 [Gleis 2], locale=de}, LocalizedText{text=, locale=de}]}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131999719975360000, javaDate=Wed Apr 17 12:53:17 CEST 2019}, serverTime=DateTime{utcTime=132164793099138549, javaDate=Fri Oct 25 14:15:09 CEST 2019}}

错误消息:

java.lang.NullPointerException: null
        at org.apache.camel.component.snmp.SnmpTrapProducer.process(SnmpTrapProducer.java:112) ~[Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) ~[Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148) ~[Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548) ~[Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) [Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:138) [Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:101) [Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) [Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97) [Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.apache.camel.component.milo.client.MiloClientConsumer.handleValueUpdate(MiloClientConsumer.java:78) [Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.eclipse.milo.opcua.sdk.client.subscriptions.OpcUaMonitoredItem.lambda$setValueConsumer$0(OpcUaMonitoredItem.java:133) ~[Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.eclipse.milo.opcua.sdk.client.subscriptions.OpcUaMonitoredItem.onValueArrived(OpcUaMonitoredItem.java:191) ~[Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.eclipse.milo.opcua.sdk.client.subscriptions.OpcUaSubscriptionManager.lambda$null$39(OpcUaSubscriptionManager.java:700) ~[Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at org.eclipse.milo.opcua.stack.core.util.ExecutionQueue$PollAndExecute.run(ExecutionQueue.java:107) ~[Schnittstellenadapter-1.0-SNAPSHOT-shaded.jar:1.0-SNAPSHOT]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[na:1.8.0_221]
        at java.util.concurrent.FutureTask.run(Unknown Source) ~[na:1.8.0_221]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:1.8.0_221]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:1.8.0_221]
        at java.lang.Thread.run(Unknown Source) ~[na:1.8.0_221]

非常感谢您的帮助


共 (1) 个答案

  1. # 1 楼答案

    SnmpTrapProducer抛出一个NPE,因为消息体似乎是空的

    如图所示,问题在于变量trap保持null。它应该成为这条线上的一个对象

    PDU trap = exchange.getIn().getBody(PDU.class);
    

    该行获取消息正文内容,并希望它是org.snmp4j.PDU的一个实例

    不幸的是,您没有显示填充消息体的代码,但是我假设消息体是空的

    在将消息传递到SNMP组件之前,请尝试注销路由中的消息正文

     .log("Message body: ${body}") 
    

    另一个选项是消息体不是org.snmp4j.PDU的另一种类型,但我认为它会抛出TypeConversionException