Pass message from handle_info to handle_demand

It is a bit more complicated than that - a producer has to buffer demand and events. Consider the following scenario:

  1. When the producer is initialized there is neither buffered demand nor buffered events.
  2. Once a consumer is subscribed it can demand events via handle_demand. It could request 1000 events. But as the producer doesn’t have any events it has to buffer demand somewhere in new_producer_state. So handle_demand returns {:noreply, [], new_producer_state}, i.e. handle_demand returns without releasing any events.
  3. The producer may then get a handle_info indicating that raw data for new events is available. That raw data my be enough to generate 1200 events. Given that demand for 1000 events is buffered handle_info can return {:noreply, events, new2_producer_state} where events is a list of 1000 events. The remaining 200 events (or the raw data to generate them) has to be buffered somewhere in new2_producer_state (i.e. buffered events).
  4. The producer may now receive another handle_demand for another 1000 events. handle_demand can immediately release the remaining 200 events in events2 by returning {:noreply, events2, new3_producer_state} while at the same time buffering demand for the remaining 800 events somewhere inside new3_producer_state.
  5. etc.
1 Like