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 groupconsumer.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 groupconsumer.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 groupconsumer.registerClient(reqMsg.clear().serviceName("<serviceName>").name("0#.SETI"), appClient, "CHAIN_CLOSURE");// etc ric groupconsumer.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_CLOSUREonRefreshMsg: JPY= CURRENCY_CLOSUREonRefreshMsg: EUR= CURRENCY_CLOSUREonRefreshMsg: 0#.SETI CHAIN_CLOSUREonRefreshMsg: GBP= CURRENCY_CLOSUREonStatusMsg: THIS_IS_A_NON_EXISTING_RIC ETC_CLOSUREonRefreshMsg: TRI.N EQUITY_CLOSUREonUpdateMsg: JPY= CURRENCY_CLOSUREonUpdateMsg: JPY= CURRENCY_CLOSUREonUpdateMsg: JPY= CURRENCY_CLOSUREonUpdateMsg: JPY= CURRENCY_CLOSUREonUpdateMsg: EUR= CURRENCY_CLOSUREonUpdateMsg: EUR= CURRENCY_CLOSURE
Hope this helps!
@VGrigoras2
Thanks @Nipat Kunvutipongsak 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.