In EMA API batch request how can we obtain separate handle and closure objects for each element?

Options
dimple.shah
dimple.shah Newcomer
edited January 22 in EMA

In this example ex370_MP_Batch, how can we obtain handle and closure object for each of the elements which are a part of the array?

public class Consumer
{
public static void main(String[] args)
{
OmmConsumer consumer = null;
try
{
AppClient appClient = new AppClient();

		consumer  = EmaFactory.createOmmConsumer(EmaFactory.createOmmConsumerConfig().host("localhost:14002").username("user"));

ElementList batch = EmaFactory.createElementList();
OmmArray array = EmaFactory.createOmmArray();

array.add(EmaFactory.createOmmArrayEntry().ascii("TRI.N"));
array.add(EmaFactory.createOmmArrayEntry().ascii("IBM.N"));

batch.add(EmaFactory.createElementEntry().array(EmaRdm.ENAME_BATCH_ITEM_LIST, array));

consumer.registerClient(EmaFactory.createReqMsg().serviceName("DIRECT_FEED").payload(batch), appClient);

Thread.sleep(60000); // API calls onRefreshMsg(), onUpdateMsg() and onStatusMsg()
}
catch (InterruptedException | OmmException excp)
{
System.out.println(excp.getMessage());
}
finally
{
if (consumer != null) consumer.uninitialize();
}
}

}

Here in above code, how can we obtain a handle as response for each of the elements in the array?

Right now, we receive only one handle object when we register OmmConsumerClient object for the batch request.

Answers

  • Hello @dimple.shah

    Please be informed that you cannot get the item handles from the OmmConsumer.registerClient() method when an application subscribes a batch request to the server.

    The reason is once the Server accepts that batch request from a consumer, Server will close that request message, and the server is going to create individual streams for each of RICs and allocate a unique handle ID to each stream.

    Example messages:

    Item Name: <not set>
    Service Name: ELEKTRON_DD
    Item State: Closed / Ok / None / 'Stream closed for batch'

    Item Name: /LSEG.L
    Service Name: ELEKTRON_DD
    Item State: Open / Ok / None / ''
    Fid: 1 Name = PROD_PERM DataType: UInt Value: 9241
    Fid: 2 Name = RDNDISPLAY DataType: UInt Value: 115
    Fid: 3 Name = DSPLY_NAME DataType: Rmtes Value: LON.STK.EXCH/d

    Item Name: /JPY=
    Service Name: ELEKTRON_DD
    Item State: Open / Ok / None / ''
    Fid: 1 Name = PROD_PERM DataType: UInt Value: 363
    Fid: 2 Name = RDNDISPLAY DataType: UInt Value: 153
    Fid: 3 Name = DSPLY_NAME DataType: Rmtes Value: NEDBANK LTD J/d

    You can find more detail about this behavior from this WebSocket API tutorial page (the WebSocket API batch logic can be applied to the EMA too).

    To get the Server generated handles, you can use the OmmConsumerEvent.handle() method in the OnRefreshMsg() method to get incoming handle ID.

    Example Code:

    class AppClient implements OmmConsumerClient{
    	public void onRefreshMsg(RefreshMsg refreshMsg, OmmConsumerEvent event){
    		
    		System.out.println("Item Name: " + (refreshMsg.hasName() ? refreshMsg.name() : "<not set>"));
    		System.out.println("Service Name: " + (refreshMsg.hasServiceName() ? refreshMsg.serviceName() : "<not set>"));
    		...
    		System.out.println("Item Handle: " + event.handle());
    		...
       }
    

    Result:

    Item Name: <not set>
    Service Name: ELEKTRON_DD
    Item State: Closed / Ok / None / 'Stream closed for batch'

    Item Name: /LSEG.L
    Service Name: ELEKTRON_DD
    Item Handle: 2

    Item Name: /JPY=
    Service Name: ELEKTRON_DD
    Item Handle: 3
    Item State: Open / Ok / None / ''

    I hope this information helps.