package alma.acs.nc;
import alma.ADMINTEST1.OnOffStates;
import alma.ADMINTEST1.statusBlockEvent1;
import alma.acs.component.client.ComponentClient;
import alma.acs.exceptions.AcsJException;
import alma.acs.nc.Helper;
import alma.acs.nc.NCPublisher;
import alma.acs.util.CmdLineArgs;
import alma.acs.util.CmdLineRegisteredOption;
/**
* Client application that continuously publishes events on a given channel.
* Can be used for manual tests with NCs, eventGUI etc.
* <p>
* Out of laziness we reuse 'statusBlockEvent1' as the published event type,
* which is already defined locally in IDL.
*
* @author hsommer
*/
public class ContinuousNcPublisher extends ComponentClient
{
public ContinuousNcPublisher(String managerLoc) throws Exception {
super(null, managerLoc, ContinuousNcPublisher.class.getSimpleName());
}
private void run(String channelName, int eventsPerBurst, int delayBurstsMillis, boolean logAfterBurst) throws AcsJException {
m_logger.info("Will continuously publish 'statusBlockEvent1' dummy events on NC '" + channelName +
"', with bursts of " + eventsPerBurst + " events and delays of " + delayBurstsMillis + " ms between bursts.");
NCPublisher<statusBlockEvent1> publisher = null;
// publisher.enableEventQueue(queueSize, handler);
statusBlockEvent1 event = new statusBlockEvent1(OnOffStates.ON, "testingEvent", 0, 0, 0, false, 0.0f);
try {
publisher = new NCPublisher<statusBlockEvent1>(
channelName,
getContainerServices(),
Helper.getNamingServiceInitial(getContainerServices()));
while (!Thread.currentThread().isInterrupted()) {
for (int i = 0; i < eventsPerBurst; i++) {
// m_logger.info("About to publish event");
publisher.publishEvent(event);
event.counter2++;
}
if (logAfterBurst) {
m_logger.info("Done with event burst " + event.counter1 + ".");
}
event.counter1++;
event.counter2 = 0;
try {
Thread.sleep(delayBurstsMillis);
} catch (InterruptedException ex) {
// while loop checks...
}
}
}
finally {
if (publisher != null) {
publisher.disconnect();
}
m_logger.info("Done.");
}
}
/**
* @param args
*/
public static void main(String[] args) {
String managerLoc = System.getProperty("ACS.manager");
if (managerLoc == null) {
System.out.println("Java property 'ACS.manager' must be set to the corbaloc of the ACS manager!");
System.exit(-1);
}
try {
CmdLineArgs cmdArgs = new CmdLineArgs();
CmdLineRegisteredOption optChannelName = new CmdLineRegisteredOption("-channelName", 1);
cmdArgs.registerOption(optChannelName);
CmdLineRegisteredOption optEventsPerBurst = new CmdLineRegisteredOption("-eventsPerBurst", 1);
cmdArgs.registerOption(optEventsPerBurst);
CmdLineRegisteredOption optDelayBurstsMillis = new CmdLineRegisteredOption("-delayBurstsMillis", 1);
cmdArgs.registerOption(optDelayBurstsMillis);
CmdLineRegisteredOption optLogAfterBurst = new CmdLineRegisteredOption("-logAfterBurst", 1);
cmdArgs.registerOption(optLogAfterBurst);
cmdArgs.parseArgs(args);
String channelName = null;
if (cmdArgs.isSpecified(optChannelName)) {
channelName = cmdArgs.getValues(optChannelName)[0].trim();
}
else {
throw new IllegalArgumentException("Option " + optChannelName.getName() + " must be specified.");
}
int eventsPerBurst = 1;
if (cmdArgs.isSpecified(optEventsPerBurst)) {
eventsPerBurst = Integer.parseInt(cmdArgs.getValues(optEventsPerBurst)[0]);
}
int delayBurstsMillis = 1000;
if (cmdArgs.isSpecified(optDelayBurstsMillis)) {
delayBurstsMillis = Integer.parseInt(cmdArgs.getValues(optDelayBurstsMillis)[0]);
}
boolean logAfterBurst = false;
if (cmdArgs.isSpecified(optLogAfterBurst)) {
logAfterBurst = Boolean.parseBoolean(cmdArgs.getValues(optLogAfterBurst)[0]);
}
new ContinuousNcPublisher(managerLoc).run(channelName, eventsPerBurst, delayBurstsMillis, logAfterBurst);
} catch (Throwable thr) {
thr.printStackTrace();
}
}
}