Pedro
Pedro

Reputation: 449

Proton-CEP Receiving events API NGSI/XML NullPointerException

I have trouble sending NGSI/XML formatted events to my Proton-CEP GE. The use case is that I will need Orion to send events to CEP.

Orion is configured to send events to Proton, which are correctly received. However, Proton reports NullPointerException when it receives them.

The output from catalina.out is:

Nov 12, 2015 7:30:27 PM com.ibm.hrl.proton.webapp.providers.EventXmlNgsiMessageReader readFrom
INFO: started event message body reader
Nov 12, 2015 7:30:27 PM com.ibm.hrl.proton.webapp.providers.EventXmlNgsiMessageReader readFrom
INFO: Event: DeviceContextUpdate
Nov 12, 2015 7:30:27 PM com.ibm.hrl.proton.webapp.providers.EventXmlNgsiMessageReader readFrom
SEVERE: Could not parse XML NGSI event java.lang.NullPointerException, reason: null
 last attribute name: null last value: null
Nov 12, 2015 7:30:27 PM com.ibm.hrl.proton.webapp.providers.EventXmlNgsiMessageReader readFrom
INFO: finished event message body reader
Nov 12, 2015 7:30:27 PM com.ibm.hrl.proton.webapp.resources.EventResource submitNewEvent
INFO: starting submitNewEvent
Nov 12, 2015 7:30:27 PM com.ibm.hrl.proton.webapp.resources.EventResource submitNewEvent
SEVERE: Could not send event, reason: java.lang.NullPointerException, message: null

Sending the following JSON event directly to CEP works:

{"Name": "Device", "datacount5": "10", "lastupdate": "12/11/2015-17:09:08"}

INFO: starting submitNewEvent
Nov 12, 2015 7:31:39 PM com.ibm.hrl.proton.router.EventRouter routeTimedObject
INFO: routeTimedObject: forwarding event Device; EventId=32314f63-75d3-489f-9d8d-dbd0ba4a42b8; Chronon=null; DetectionTime=1447353099831; Name=Device; Certainty=0.0; Cost=0.0; lastupdate=1447344548000; EventSource=; OccurrenceTime=null; datacount5=10; Annotation=; Duration=0.0; ExpirationTime=null;  to consumer...
Nov 12, 2015 7:31:39 PM com.ibm.hrl.proton.webapp.resources.EventResource submitNewEvent
INFO: events sent to proton runtime...

However, sending it in NGSI/XML produced a NullPointer Exception as above. The sent message is:

<notifyContextRequest>
  <subscriptionId>51a60c7a286043f73ce9606c</subscriptionId>
  <originator>localhost</originator>
  <contextResponseList>
    <contextElementResponse>
      <contextElement>
        <entityId type="Device" isPattern="false">
          <id>Device.imei2</id>
        </entityId>
        <contextAttributeList>
          <contextAttribute>
            <name>datacount5</name>
            <contextValue>5</contextValue>
          </contextAttribute>
        </contextAttributeList>
      </contextElement>
      <statusCode>
        <code>200</code>
        <reasonPhrase>OK</reasonPhrase>
      </statusCode>
    </contextElementResponse>
  </contextResponseList>
</notifyContextRequest>

Note: I have also tried sending the message found in the documentation and I get the same NullPointerException, so I know it is not a XML formatting issue.

What is the reason phqp the JSON objects are accepted, but the NGSI/XML fail?

Upvotes: 2

Views: 288

Answers (2)

Tal Haham
Tal Haham

Reputation: 1638

When NGSI/xml messages are parsed by the CEP, there is a translation process between the NGSI message and the CEP input event.

The matching input event defined in the CEP must have the name <entity type>ContextUpdate which is DeviceContextUpdate in your case

This input event must have the following attributes:

  • entityId – of type String. This attribute holds the entityId value provided in the message
  • entityType – of type String. This attributes holds the entity type provided in the message

Details and example can be found in the CEP user guide appendix

Upvotes: 2

Pedro
Pedro

Reputation: 449

It turns out that the Event name is different when sending an Event using the JSON REST than the XML/NGSI format.

When using JSON, the event name is exactly as described in the JSON object

{"Name": "Device", "datacount5": "10"}

so, Device.

In the case of XML/NGSI, even if the entity type is also set to Device like this:

<entityId type="Device" isPattern="false">
  <id>Device.imei2</id>
</entityId>

The Event name is converted to DeviceContextUpdate.

This information is provided (hidden?) in the Appendix A of the user documentation.

Upvotes: 0

Related Questions