summaryrefslogtreecommitdiff
path: root/java/demo/IceStorm/clock/Subscriber.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/demo/IceStorm/clock/Subscriber.java')
-rw-r--r--java/demo/IceStorm/clock/Subscriber.java153
1 files changed, 112 insertions, 41 deletions
diff --git a/java/demo/IceStorm/clock/Subscriber.java b/java/demo/IceStorm/clock/Subscriber.java
index 047e0e16329..7fac97459ec 100644
--- a/java/demo/IceStorm/clock/Subscriber.java
+++ b/java/demo/IceStorm/clock/Subscriber.java
@@ -23,51 +23,64 @@ public class Subscriber extends Ice.Application
public void
usage()
{
- System.out.println("Usage: " + appName() + " [--batch] [--datagram|--twoway|--ordered|--oneway] [topic]");
+ System.out.println("Usage: " + appName() + " [--batch] [--datagram|--twoway|--ordered|--oneway] " +
+ "[--retryCount count] [--id id] [topic]");
}
public int
run(String[] args)
{
- IceStorm.TopicManagerPrx manager = IceStorm.TopicManagerPrxHelper.checkedCast(
- communicator().propertyToProxy("IceStorm.TopicManager.Proxy"));
- if(manager == null)
- {
- System.err.println("invalid proxy");
- return 1;
- }
+ args = communicator().getProperties().parseCommandLineOptions("Clock", args);
String topicName = "time";
- boolean datagram = false;
- boolean twoway = false;
- boolean ordered = false;
+ String option = "None";
boolean batch = false;
- int optsSet = 0;
- for(int i = 0; i < args.length; ++i)
+ String id = null;
+ String retryCount = null;
+ int i;
+ for(i = 0; i < args.length; ++i)
{
+ String oldoption = option;
if(args[i].equals("--datagram"))
{
- datagram = true;
- ++optsSet;
+ option = "Datagram";
}
else if(args[i].equals("--twoway"))
{
- twoway = true;
- ++optsSet;
+ option = "Twoway";
}
else if(args[i].equals("--ordered"))
{
- ordered = true;
- ++optsSet;
+ option = "Ordered";
}
else if(args[i].equals("--oneway"))
{
- ++optsSet;
+ option = "Oneway";
}
else if(args[i].equals("--batch"))
{
batch = true;
}
+ else if(args[i].equals("--id"))
+ {
+ ++i;
+ if(i >= args.length)
+ {
+ usage();
+ return 1;
+ }
+ id = args[i];
+ }
+ else if(args[i].equals("--retryCount"))
+ {
+ ++i;
+ if(i >= args.length)
+ {
+ usage();
+ return 1;
+ }
+ retryCount = args[i];
+ }
else if(args[i].startsWith("--"))
{
usage();
@@ -75,22 +88,53 @@ public class Subscriber extends Ice.Application
}
else
{
- topicName = args[i];
+ topicName = args[i++];
break;
}
+
+ if(!oldoption.equals(option) && !oldoption.equals("None"))
+ {
+ usage();
+ return 1;
+ }
+ }
+
+ if(i != args.length)
+ {
+ usage();
+ return 1;
+ }
+
+ if(retryCount != null)
+ {
+ if(option.equals("None"))
+ {
+ option = "Twoway";
+ }
+ else if(!option.equals("Twoway") && !option.equals("Ordered"))
+ {
+ usage();
+ return 1;
+ }
}
- if(batch && (twoway || ordered))
+
+ if(batch && (option.equals("Twoway") || option.equals("Ordered")))
{
System.err.println(appName() + ": batch can only be set with oneway or datagram");
return 1;
}
- if(optsSet > 1)
+ IceStorm.TopicManagerPrx manager = IceStorm.TopicManagerPrxHelper.checkedCast(
+ communicator().propertyToProxy("TopicManager.Proxy"));
+ if(manager == null)
{
- usage();
+ System.err.println("invalid proxy");
return 1;
}
+ //
+ // Retrieve the topic.
+ //
IceStorm.TopicPrx topic;
try
{
@@ -112,50 +156,77 @@ public class Subscriber extends Ice.Application
Ice.ObjectAdapter adapter = communicator().createObjectAdapter("Clock.Subscriber");
//
- // Add a Servant for the Ice Object.
+ // Add a servant for the Ice object. If --id is used the
+ // identity comes from the command line, otherwise a UUID is
+ // used.
//
+ // id is not directly altered since it is used below to detect
+ // whether subscribeAndGetPublisher can raise
+ // AlreadySubscribed.
+ //
+ Ice.Identity subId = new Ice.Identity(id, "");
+ if(subId.name == null)
+ {
+ subId.name = Ice.Util.generateUUID();
+ }
+ Ice.ObjectPrx subscriber = adapter.add(new ClockI(), subId);
+
java.util.Map<String, String> qos = new java.util.HashMap<String, String>();
- Ice.ObjectPrx subscriber = adapter.addWithUUID(new ClockI());
+ if(retryCount != null)
+ {
+ qos.put("retryCount", retryCount);
+ }
//
// Set up the proxy.
//
- if(datagram)
+ if(option.equals("Datagram"))
{
- subscriber = subscriber.ice_datagram();
+ if(batch)
+ {
+ subscriber = subscriber.ice_batchDatagram();
+ }
+ else
+ {
+ subscriber = subscriber.ice_datagram();
+ }
}
- else if(twoway)
+ else if(option.equals("Twoway"))
{
// Do nothing to the subscriber proxy. Its already twoway.
}
- else if(ordered)
+ else if(option.equals("Ordered"))
{
// Do nothing to the subscriber proxy. Its already twoway.
qos.put("reliability", "ordered");
}
- else // if(oneway)
+ else if(option.equals("Oneway") || option.equals("None"))
{
- subscriber = subscriber.ice_oneway();
- }
- if(batch)
- {
- if(datagram)
+ if(batch)
{
- subscriber = subscriber.ice_batchDatagram();
+ subscriber = subscriber.ice_batchOneway();
}
else
{
- subscriber = subscriber.ice_batchOneway();
+ subscriber = subscriber.ice_oneway();
}
}
-
+
try
{
topic.subscribeAndGetPublisher(qos, subscriber);
}
catch(IceStorm.AlreadySubscribed e)
{
- e.printStackTrace();
- return 1;
+ // If we're manually setting the subscriber id ignore.
+ if(id == null)
+ {
+ e.printStackTrace();
+ return 1;
+ }
+ else
+ {
+ System.out.println("reactivating persistent subscriber");
+ }
}
catch(IceStorm.BadQoS e)
{