Asking on behalf of a client, please provide a simple example making use of closure in EMA Java to map subscriptions back to my own objects.
Asking on behalf of a client, please provide a simple example making use of closure in EMA Java to map subscriptions back to my own objects.
A general usage of closure is to be as an identifier (the application-specific purpose) of item subscriptions. So that the application can distinguish an event received in the callback methods by checking the closure object.
Here this is the example code (modified from example100 MarketPrice_Streaming):
** Calling registerClient using a closure object**
AppClient appClient = new AppClient(); OmmConsumerConfig config = EmaFactory.createOmmConsumerConfig(); consumer = EmaFactory.createOmmConsumer(config.host("<host>:<port>").username("<username>")); ReqMsg reqMsg = EmaFactory.createReqMsg(); // equity ric group consumer.registerClient(reqMsg.clear().serviceName("<serviceName>").name("IBM.N"), appClient, "EQUITY_CLOSURE"); consumer.registerClient(reqMsg.clear().serviceName("<serviceName>").name("TRI.N"), appClient, "EQUITY_CLOSURE"); // currency ric group consumer.registerClient(reqMsg.clear().serviceName("<serviceName>").name("JPY="), appClient, "CURRENCY_CLOSURE"); consumer.registerClient(reqMsg.clear().serviceName("<serviceName>").name("GBP="), appClient, "CURRENCY_CLOSURE"); consumer.registerClient(reqMsg.clear().serviceName("<serviceName>").name("EUR="), appClient, "CURRENCY_CLOSURE"); // chain ric group consumer.registerClient(reqMsg.clear().serviceName("<serviceName>").name("0#.SETI"), appClient, "CHAIN_CLOSURE"); // etc ric group consumer.registerClient(reqMsg.clear().serviceName("<serviceName>").name("THIS_IS_A_NON_EXISTING_RIC"), appClient, "ETC_CLOSURE");
** Printing a closure object in the callback method **
public void onRefreshMsg(RefreshMsg refreshMsg, OmmConsumerEvent event) { System.out.print("onRefreshMsg: \t"); System.out.print(refreshMsg.name()); System.out.print("\t"); System.out.println(event.closure()); } public void onUpdateMsg(UpdateMsg updateMsg, OmmConsumerEvent event) { System.out.print("onUpdateMsg: \t"); System.out.print(updateMsg.name()); System.out.print("\t"); System.out.println(event.closure()); } public void onStatusMsg(StatusMsg statusMsg, OmmConsumerEvent event) { System.out.print("onStatusMsg: \t"); System.out.print(statusMsg.name()); System.out.print("\t"); System.out.println(event.closure()); }
** Here this is the result **
onRefreshMsg: IBM.N EQUITY_CLOSURE onRefreshMsg: JPY= CURRENCY_CLOSURE onRefreshMsg: EUR= CURRENCY_CLOSURE onRefreshMsg: 0#.SETI CHAIN_CLOSURE onRefreshMsg: GBP= CURRENCY_CLOSURE onStatusMsg: THIS_IS_A_NON_EXISTING_RIC ETC_CLOSURE onRefreshMsg: TRI.N EQUITY_CLOSURE onUpdateMsg: JPY= CURRENCY_CLOSURE onUpdateMsg: JPY= CURRENCY_CLOSURE onUpdateMsg: JPY= CURRENCY_CLOSURE onUpdateMsg: JPY= CURRENCY_CLOSURE onUpdateMsg: EUR= CURRENCY_CLOSURE onUpdateMsg: EUR= CURRENCY_CLOSURE
Hope this helps!
Thanks @Nipat that helps.
Users should note that closure doesn't have to be a static string, it can be a pointer to your object or an index to your structure and it can be unique for every item or it can group items as in this example.