Let your observers add the received events (or their identifiers) to some temporary storage, and when each new event is received, let them check whether the same event is stored in the storage. If so, they should not process it.
But if we try to solve the problem, and not find a suitable solution, then your problem is that object A can listen to object B, and object B can listen to object A at the same time (possibly with some intermediary objects). This is a bad design IMHO.
Observers should be used to loosen traction, making object A aware of object B, but not vice versa.
If your objects A and B both know about each other, I donβt understand why you need to use observers.
Roman
source share