question

Upvotes
Accepted
476 6 15 18

Example of closure in EMA

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.

elektronrefinitiv-realtimeelektron-sdkrrtema-apielektron-message-api
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

1 Answer

Upvotes
Accepted
1.9k 7 9 16

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!

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

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.