 |
» |
|
|
 |
If you are developing an application that subscribes for a
set of events that can be posted in high volume over a short period,
your program may occasionally be notified by the EVM daemon that
it has missed one or more events. This occurs if the program has
a significant amount of processing to do and is unable to handle
when a new event arrives immediately, causing unhandled events to
fill the connection buffers. It watches for notification of missed
events by including the EvmREASON_EVENTS_MISSED reason
in its callback function and displays a message that includes the
number of events missed. For more information about missed events,
see “Missed Events”. Example 4-10 “Dealing with Missed Events” shows
how to subscribe for all events and displays each event on stdout as
it arrives.
Example 4-10 Dealing with Missed Events  |
#include <stdio.h>#include <evm/evm.h>#include<unistd.h>void EventCB(EvmConnection_t conn, EvmCallbackArg_t cbarg, EvmCallbackData_t *cbdata);/*===============================================* Function: main()*===============================================*/int main(){ EvmConnection_t conn; EvmStatus_t status; int conn_fd; status = EvmConnCreate(EvmCONNECTION_LISTEN, EvmRESPONSE_CALLBACK,NULL,EventCB,NULL,&conn); if (status != EvmERROR_NONE) { fprintf(stderr,"Failed to create EVM listening connection\n"); exit(1); } status = EvmConnSubscribe(conn,NULL,"[name *]"); /* This code segment subscribes for notification of all events. */ if (status != EvmERROR_NONE) { fprintf(stderr,"Failed to subscribe for event notification\n"); exit(1); } for (;;) { status = EvmConnWait(conn,NULL); if (status != EvmERROR_NONE) { fprintf(stderr,"Connection error\n"); exit(1); } if (EvmConnDispatch(conn) != EvmERROR_NONE) { fprintf(stderr,"Connection dispatch error\n"); exit(1); } }}/*===============================================* Function: EventCB()*===============================================*/void EventCB(EvmConnection_t conn, EvmCallbackArg_t cbarg, EvmCallbackData_t *cbdata){ char buff[256]; switch (cbdata->reason) { case EvmREASON_EVENT_DELIVERED: EvmEventFormat(buff, sizeof(buff), cbdata->event); fprintf(stdout,"Event: %s\n",buff); EvmEventDestroy(cbdata->event); /* To demonstrate missing events, sleep for one second after each event is received. This simulates a heavy processing load and ensures that the input connection buffer will be filled if the event load is heavy.*/ sleep(1); break; /* The callback function is invoked with reason code EvmREASON_EVENTS_MISSED if the daemon is unable to send one or more missed events. The callback data member extension.eventMissedData.missedCount contains a count of the number of missed events.*/ case EvmREASON_EVENTS_MISSED: fprintf(stdout,"*** Missed %d incoming events\n", cbdata->extension.eventMissedData.missedCount); break; default: break; }} |
 |
|