Universal Messaging 9.12 | Developer Guide | Enterprise APIs | Enterprise Developer's Guide for Java | Publish / Subscribe Using Channels/Topics | Durable channel consumers and named objects
 
Durable channel consumers and named objects
Universal Messaging provides the ability for both asynchronous and synchronous consumers to be durable. Durable consumers allow state to be kept at the server with regard to what events have been consumed by a specific consumer of data.
Universal Messaging supports durable consumers through use of Universal Messaging named objects as shown by the following example code (see Named Objects).
Named objects can also be managed via the enterprise manager.
Asynchronous Durable Consumer
An example of how to create a named object that begins from event id 0, persistent and is used in conjunction with an asynchronous event consumer:

public class mySubscriber implements nEventListener {

public mySubscriber() throws Exception {
// construct your session
// and channel objects here
// create the named object and begin consuming events from the channel at event id 0
// i.e. the beginning of the channel
nNamedObject nobj = myChannel.createNamedObject("unique1", 0, true);
myChannel.addSubscriber(this , nobj);
}

public void go(nConsumeEvent event) {
System.out.println("Consumed event "+event.getEventID());
}

public static void main(String[] args) {
new mySubscriber();
}
}
Synchronous Durable Consumer
An example of how to create a named object that begins from event id 0, persistent and is used in conjunction with a synchronous event consumer:

public class myIterator {

nChannelIterator iterator = null;

public myIterator() throws Exception {
// construct your session
// and channel objects here
// start the iterator at the beginning of the channel (event id 0)
nNamedObject nobj = myChannel.createNamedObject("unique2", 0, true);
iterator = myChannel.createIterator(0);
}

public void start() {
while (true) {
nConsumeEvent event = iterator.getNext();
go(event);
}
}

public void go(nConsumeEvent event) {
System.out.println("Consumed event "+event.getEventID());
}

public static void main(String[] args) {
myIterator itr = new myIterator();
itr.start();
}
}
Both synchronous and asynchronous channel consumers allow message selectors to be used in conjunction with named objects. Please see the API documentation for more information.
There are also different ways in which events consumed by named consumers can be acknowledged. By specifying that 'auto acknowledge' is true when constructing either the synchronous or asynchronous consumers, then each event is acknowledged as consumed automatically. If 'auto acknowledge' is set to false, then each event consumed has to be acknowledged by calling the ack() method:

public void go(nConsumeEvent event) {
System.out.println("Consumed event "+event.getEventID());
event.ack();
}
Priority
Two subscribers can hold a subscription to the same named object. One is given priority and will process events during normal operation. If, however, the subscriber with priority is disconnected for whatever reason, and is unable to process events, the second subscriber to that named object will take over and continue to process events as they come in. This allows failover, with backup subscribers handling events if the subscriber with priority goes down.
To do this, we simply create the subscriber with a boolean specifying if this subscriber priority. Only one subscriber is allowed priority at any given time. An example of a named object specifying priority is shown below:

nNamedObject named = myChannel.createNamedObject(subname, startEid,
persistent, cluster, priority);

Copyright © 2013-2019 | Software AG, Darmstadt, Germany and/or Software AG USA, Inc., Reston, VA, USA, and/or its subsidiaries and/or its affiliates and/or their licensors.