The first call within setValue is done even if the change is not triggered by an SNMP request. If a listener is only interested in changes from SNMP requests, MOChangeEvents with (getSubRequest() == null) can be ignored.
The second call triggered by MOScalar.commit has the sub request set in MOChangEvent.
That is somehow redundant but could not be solved in a better way while providing backward compatibility. This might be optimised with SNMP4J 4.0.