You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2015/07/10 00:12:04 UTC
[24/50] qpid-proton git commit: PROTON-881: Tidy up proton-j reactor
examples
PROTON-881: Tidy up proton-j reactor examples
Tidy up comments and more closely mirror the Python examples.
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/14972594
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/14972594
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/14972594
Branch: refs/heads/cjansen-cpp-client
Commit: 149725943f980241445b53ef9d6a6e97754af3fd
Parents: 2f8728a
Author: Adrian Preston <pr...@uk.ibm.com>
Authored: Wed Jul 1 01:22:55 2015 +0100
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Sun Jul 5 19:57:39 2015 -0400
----------------------------------------------------------------------
.../apache/qpid/proton/example/reactor/Cat.java | 10 +++--
.../proton/example/reactor/CountRandomly.java | 1 +
.../qpid/proton/example/reactor/Counter.java | 7 +++-
.../qpid/proton/example/reactor/Echo.java | 14 +++++--
.../proton/example/reactor/GlobalLogger.java | 39 --------------------
.../proton/example/reactor/GoodbyeWorld.java | 6 +--
.../qpid/proton/example/reactor/HelloWorld.java | 3 +-
.../qpid/proton/example/reactor/README.md | 31 ++++++++++++++++
.../proton/example/reactor/ReactorLogger.java | 34 -----------------
.../qpid/proton/example/reactor/Recv.java | 4 +-
.../qpid/proton/example/reactor/Scheduling.java | 11 ++++++
11 files changed, 71 insertions(+), 89 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Cat.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Cat.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Cat.java
index 7cc1df3..cb8ceca 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Cat.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Cat.java
@@ -38,14 +38,19 @@ public class Cat extends BaseHandler {
@Override
public void onSelectableInit(Event event) {
Selectable selectable = event.getSelectable();
- Reactor reactor = event.getReactor();
+ // We can configure a selectable with any SelectableChannel we want.
+ selectable.setChannel(channel);
+ // Ask to be notified when the channel is readable
selectable.setReading(true);
- reactor.update(selectable);
+ event.getReactor().update(selectable);
}
@Override
public void onSelectableReadable(Event event) {
Selectable selectable = event.getSelectable();
+
+ // The onSelectableReadable event tells us that there is data
+ // to be read, or the end of stream has been reached.
SourceChannel channel = (SourceChannel)selectable.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
try {
@@ -77,7 +82,6 @@ public class Cat extends BaseHandler {
public void onReactorInit(Event event) {
Reactor reactor = event.getReactor();
Selectable selectable = reactor.selectable();
- selectable.setChannel(channel);
setHandler(selectable, new EchoHandler());
reactor.update(selectable);
}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/CountRandomly.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/CountRandomly.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/CountRandomly.java
index 0dcdf4a..9a5a0b4 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/CountRandomly.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/CountRandomly.java
@@ -55,6 +55,7 @@ public class CountRandomly extends BaseHandler {
}
}
+ // Provide a method to check for doneness
private boolean done() {
return count >= limit;
}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Counter.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Counter.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Counter.java
index a34038e..b05685a 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Counter.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Counter.java
@@ -45,6 +45,8 @@ public class Counter extends BaseHandler {
count += 1;
System.out.println(count);
if (count < limit) {
+ // A recurring task can be accomplished by just scheduling
+ // another event.
event.getReactor().schedule(250, this);
}
}
@@ -57,8 +59,9 @@ public class Counter extends BaseHandler {
// Note that unlike the previous scheduling example, we pass in
// a separate object for the handler. This means that the timer
- // event we just scheduled will not be seen by Program as it is
- // being handled by the Counter instance we create.
+ // event we just scheduled will not be seen by the Counter
+ // implementation of BaseHandler as it is being handled by the
+ // CounterHandler instance we create.
event.getReactor().schedule(250, new CounterHandler(10));
}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Echo.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Echo.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Echo.java
index e2b0807..852bf8e 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Echo.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Echo.java
@@ -37,14 +37,19 @@ public class Echo extends BaseHandler {
@Override
public void onSelectableInit(Event event) {
Selectable selectable = event.getSelectable();
- Reactor reactor = event.getReactor();
+ // We can configure a selectable with any SelectableChannel we want.
+ selectable.setChannel(channel);
+ // Ask to be notified when the channel is readable
selectable.setReading(true);
- reactor.update(selectable);
+ event.getReactor().update(selectable);
}
@Override
public void onSelectableReadable(Event event) {
Selectable selectable = event.getSelectable();
+
+ // The onSelectableReadable event tells us that there is data
+ // to be read, or the end of stream has been reached.
SourceChannel channel = (SourceChannel)selectable.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
try {
@@ -74,10 +79,13 @@ public class Echo extends BaseHandler {
@Override
public void onReactorInit(Event event) {
+ // Every selectable is a possible source of future events. Our
+ // selectable stays alive until it reads the end of stream
+ // marker. This will keep the whole reactor running until we
+ // type Control-D.
System.out.println("Type whatever you want and then use Control-D to exit:");
Reactor reactor = event.getReactor();
Selectable selectable = reactor.selectable();
- selectable.setChannel(channel);
setHandler(selectable, new EchoHandler());
reactor.update(selectable);
}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GlobalLogger.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GlobalLogger.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GlobalLogger.java
index 1bb3d3e..ec56bd5 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GlobalLogger.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GlobalLogger.java
@@ -28,45 +28,6 @@ import org.apache.qpid.proton.engine.BaseHandler;
import org.apache.qpid.proton.engine.Event;
import org.apache.qpid.proton.reactor.Reactor;
-/*
-# Not every event goes to the reactor's event handler. If we have a
-# separate handler for something like a scheduled task, then those
-# events aren't logged by the logger associated with the reactor's
-# handler. Sometimes this is useful if you don't want to see them, but
-# sometimes you want the global picture.
-
-class Logger:
-
- def on_unhandled(self, name, event):
- print "LOG:", name, event
-
-class Task:
-
- def on_timer_task(self, event):
- print "Mission accomplished!"
-
-class Program:
-
- def on_reactor_init(self, event):
- print "Hello, World!"
- event.reactor.schedule(0, Task())
-
- def on_reactor_final(self, event):
- print "Goodbye, World!"
-
-r = Reactor(Program())
-
-# In addition to having a regular handler, the reactor also has a
-# global handler that sees every event. By adding the Logger to the
-# global handler instead of the regular handler, we can log every
-# single event that occurs in the system regardless of whether or not
-# there are specific handlers associated with the objects that are the
-# target of those events.
-r.global_handler.add(Logger())
-r.run()
-
- */
-
// Not every event goes to the reactor's event handler. If we have a
// separate handler for something like a scheduled task, then those
// events aren't logged by the logger associated with the reactor's
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GoodbyeWorld.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GoodbyeWorld.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GoodbyeWorld.java
index b04273b..6a69ba1 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GoodbyeWorld.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GoodbyeWorld.java
@@ -28,13 +28,11 @@ import org.apache.qpid.proton.engine.BaseHandler;
import org.apache.qpid.proton.engine.Event;
import org.apache.qpid.proton.reactor.Reactor;
-// TODO: sort out docs!
// So far the reactive hello-world doesn't look too different from a
-// regular old non-reactive hello-world. The on_reactor_init method can
+// regular old non-reactive hello-world. The onReactorInit method can
// be used roughly as a 'main' method would. A program that only uses
// that one event, however, isn't going to be very reactive. By using
// other events, we can write a fully reactive program.
-
public class GoodbyeWorld extends BaseHandler {
// As before we handle the reactor init event.
@@ -46,7 +44,7 @@ public class GoodbyeWorld extends BaseHandler {
// In addition to an initial event, the reactor also produces an
// event when it is about to exit. This may not behave much
// differently than just putting the goodbye print statement inside
- // on_reactor_init, but as we grow our program, this piece of it
+ // onReactorInit, but as we grow our program, this piece of it
// will always be what happens last, and will always happen
// regardless of what other paths the main logic of our program
// might take.
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java
index 055d6df..39a36fb 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java
@@ -28,7 +28,6 @@ import org.apache.qpid.proton.engine.BaseHandler;
import org.apache.qpid.proton.engine.Event;
import org.apache.qpid.proton.reactor.Reactor;
-// TODO: sort out docs!
/*
* The proton reactor provides a general purpose event processing
* library for writing reactive programs. A reactive program is defined
@@ -49,7 +48,7 @@ public class HelloWorld extends BaseHandler {
public static void main(String[] args) throws IOException {
// When you construct a reactor, you can give it a handler that
- // is used, by default.
+ // is used, by default, to receive events generated by the reactor.
Reactor reactor = Proton.reactor(new HelloWorld());
// When you call run, the reactor will process events. The reactor init
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/README.md
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/README.md b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/README.md
new file mode 100644
index 0000000..73fbb87
--- /dev/null
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/README.md
@@ -0,0 +1,31 @@
+The examples in this directory provide a basic introduction to the
+proton reactor API and are best viewed in the order presented below.
+
+The examples contain comments that explain things in a tutorial-style
+manner. At some point soon this content will be pulled out into a
+proper tutorial that references the relevant code snippets from these
+examples. Until then please bear with this clumsy style of
+presentation.
+
+This API is present in Java and Python as well. Most of these examples will
+transliterate into C in a fairly straightforward way.
+
+ - HelloWorld.java
+ - GoodbyeWorld.java
+
+ - Scheduling.java
+ - Counter.java
+ - CountRandomly.java
+
+ - Unhandled.java
+ - ReactorLogger.java
+ - GlobalLogger.java
+ - Delegates.java
+
+ - Handlers.java
+
+ - Echo.java
+ - Cat.java
+
+ - Send.java
+ - Recv.java
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/ReactorLogger.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/ReactorLogger.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/ReactorLogger.java
index b4a8cba..31c7511 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/ReactorLogger.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/ReactorLogger.java
@@ -28,40 +28,6 @@ import org.apache.qpid.proton.engine.BaseHandler;
import org.apache.qpid.proton.engine.Event;
import org.apache.qpid.proton.reactor.Reactor;
-/*
-class Logger:
-
- def on_unhandled(self, name, event):
- print "LOG:", name, event
-
-class Program:
-
- def on_reactor_init(self, event):
- print "Hello, World!"
-
- def on_reactor_final(self, event):
- print "Goodbye, World!"
-
-# You can pass multiple handlers to a reactor when you construct it.
-# Each of these handlers will see every event the reactor sees. By
-# combining this with on_unhandled, you can log each event that goes
-# to the reactor.
-r = Reactor(Program(), Logger())
-r.run()
-
-# Note that if you wanted to add the logger later, you could also
-# write the above as below. All arguments to the reactor are just
-# added to the default handler for the reactor.
-
-def logging_enabled():
- return False
-
-r = Reactor(Program())
-if logging_enabled():
- r.handler.add(Logger())
-r.run()
-
- */
public class ReactorLogger extends BaseHandler {
public static class Logger extends BaseHandler {
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Recv.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Recv.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Recv.java
index a5c6291..96a348a 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Recv.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Recv.java
@@ -50,9 +50,9 @@ public class Recv extends BaseHandler {
// There is an optional third argument to the Reactor.acceptor
// call. Using it, we could supply a handler here that would
// become the handler for all accepted connections. If we omit
- // it, the reactor simply inherets all the connection events.
+ // it, the reactor simply inherits all the connection events.
} catch(IOException ioException) {
- ioException.printStackTrace(); // TODO: what is the right answer?
+ ioException.printStackTrace();
}
}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Scheduling.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Scheduling.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Scheduling.java
index f304b74..3aed27a 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Scheduling.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Scheduling.java
@@ -37,7 +37,18 @@ public class Scheduling extends BaseHandler {
public void onReactorInit(Event event) {
startTime = System.currentTimeMillis();
System.out.println("Hello, World!");
+
+ // We can schedule a task event for some point in the future.
+ // This will cause the reactor to stick around until it has a
+ // chance to process the event.
+
+ // The first argument is the delay. The second argument is the
+ // handler for the event. We are just using self for now, but
+ // we could pass in another object if we wanted.
Task task = event.getReactor().schedule(1000, this);
+
+ // We can ignore the task if we want to, but we can also use it
+ // to pass stuff to the handler.
task.attachments().set("key", String.class, "Yay");
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org