将mule消息有效负载转换为snmp陷阱或pdu对象
我已经应用了一个使用snmp4j发送和接收陷阱的示例,一切正常。将mule消息有效负载转换为snmp陷阱或pdu对象,mule,snmp,snmp4j,Mule,Snmp,Snmp4j,我已经应用了一个使用snmp4j发送和接收陷阱的示例,一切正常。 但问题是: 当使用mule esb接收snmp陷阱时,我无法将传入消息有效负载转换为PDU(或任何snmp4j合适的对象)以从中提取数据,我做了大量搜索,但徒劳。 谁能帮助我: 将我从udp端点收到的mule esb消息负载转换为org.snmp4j.PDU对象以从中提取陷阱数据? 这是我的代码: public synchronized MuleEvent process(MuleEvent event) throws
但问题是:
当使用mule esb接收snmp陷阱时,我无法将传入消息有效负载转换为PDU(或任何snmp4j合适的对象)以从中提取数据,我做了大量搜索,但徒劳。
谁能帮助我:
将我从udp端点收到的mule esb消息负载转换为org.snmp4j.PDU对象以从中提取陷阱数据?
这是我的代码:
public synchronized MuleEvent process(MuleEvent event) throws MuleException { byte[] encodedMessage = event.getMessage().getPayload(byte[].class); //next line is not working but its only sample of what I Am looking for PDU pdu = new PDU(encodedMessage ); ..... 公共同步MuleEvent进程(MuleEvent事件)引发muleeexception{ 字节[]encodedMessage=event.getMessage().getPayload(字节[].class); //下一行不起作用,但它是我所寻找的唯一样本 PDU PDU=新PDU(编码消息); .....
非常感谢您提供的任何帮助。您需要创建一个自定义转换器,用于转换相关SNMP4J对象中的消息负载。或者,如果SNMP4J API足够简单,也可以使用表达式转换器来完成此操作。
公共类SNMP4JParser实现可调用{
public class SNMP4JParser implements Callable {
/**
* The following objects are all necessary in order to use SNMP4j as a parser for raw messages.
* This was all inspired by SNMP4j source code, in particular MessageDispatcherImpl.java
*/
private MessageProcessingModel model = null;
private MessageDispatcher dispatcher = null;
private Address listenAddress = null;
private Integer32 messageProcessingModel = null;
private Integer32 securityModel = null;
private OctetString securityName = null;
private Integer32 securityLevel = null;
private PduHandle handle = null;
private StatusInformation statusInfo = null;
private MutableStateReference mutableStateReference = null;
/**
* Taken from org.snmp4j.transport.AbstractTransportMapping class
*/
protected Integer32 maxInboundMessageSize = new Integer32 ( (1 << 16) - 1 );
/**
* Taken from org.snmp4j.MessageDispatcherImpl class
*/
private int transactionID = new Random().nextInt(Integer.MAX_VALUE - 2) + 1;
/**
* Create all objects that SNMP4j needs to parse a raw SNMP message
*/
public SNMP4JParser()
{
model = new MPv1();
dispatcher = new MessageDispatcherImpl();
listenAddress = GenericAddress.parse("udp:0.0.0.0/2001");
messageProcessingModel = new Integer32();
securityModel = new Integer32();
securityName = new OctetString();
securityLevel = new Integer32();
handle = new PduHandle(transactionID);
statusInfo = new StatusInformation();
mutableStateReference = new MutableStateReference();
}
/**
* @see org.mule.api.lifecycle.Callable#onCall(org.mule.api.MuleEventContext)
*/
@Override
public Object onCall(MuleEventContext eventContext) throws Exception
{
byte[] payloadBytes = eventContext.getMessage().getPayloadAsBytes();
ByteBuffer buffer = ByteBuffer.wrap(payloadBytes);
BERInputStream wholeMessage = new BERInputStream(buffer);
MutablePDU mutablePdu = new MutablePDU();
int status = model.prepareDataElements(
dispatcher,
listenAddress,
wholeMessage,
messageProcessingModel,
securityModel,
securityName,
securityLevel,
mutablePdu,
handle,
maxInboundMessageSize,
statusInfo,
mutableStateReference);
if ( status != SnmpConstants.SNMP_MP_OK )
throw new RuntimeException(
"Couldn't parse SNMP message. model.prepareDataElements() returned " + status);
return mutablePdu.getPdu();
}
}
/**
*要将SNMP4j用作原始消息的解析器,以下对象都是必需的。
*这一切都源于SNMP4j源代码,特别是MessageDispatcherImpl.java
*/
private MessageProcessingModel model=null;
private MessageDispatcher=null;
私有地址listenadress=null;
私有整数32 messageProcessingModel=null;
私有整数32 securityModel=null;
私有八进制字符串securityName=null;
私有整数32 securityLevel=null;
私有PDU句柄=null;
私有状态信息statusInfo=null;
私有MutableStateReference MutableStateReference=null;
/**
*取自org.snmp4j.transport.AbstractTransportMapping类
*/
protected Integer32 maxInboundMessageSize=new Integer32((1当您实现自己的传输映射并将其与SNMP4J MessageDispatcherImpl关联时,您可以更轻松地将BER流转换为SNMP4J PDU。然后将所有必要的MessageProcessingModels和SecurityProtocols添加到消息调度程序
最后,将CommandResponder接口的实现添加到消息调度程序中,您就完成了。谢谢您的回复,但是您是否有任何在transformer中转换为snmp4j对象的示例?不,我没有。在您的问题中显示您所做的,我们将帮助您修复它。字节[]
payload存在于?它是一个序列化的org.snmp4j.PDU
对象吗?其他什么?
<udp:connector name="connector" doc:name="UDP"/>
<flow name="snmp-demo-trapHandlingFlow" doc:name="snmp-demo-trapHandlingFlow">
<udp:inbound-endpoint host="0.0.0.0" port="2001" responseTimeout="10000" doc:name="UDP"/>
<logger message="TRAP RECEIVED - #[System.currentTimeMillis()]" level="DEBUG" doc:name="Inbound timestamp"/>
<component class="com.netboss.flow.demo.SNMP4JParser" doc:name="SNMP4JParser"/>
[...]