aboutsummaryrefslogtreecommitdiff
path: root/examples/redis-pubsub.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'examples/redis-pubsub.tcl')
-rw-r--r--examples/redis-pubsub.tcl61
1 files changed, 61 insertions, 0 deletions
diff --git a/examples/redis-pubsub.tcl b/examples/redis-pubsub.tcl
new file mode 100644
index 0000000..ce0f78c
--- /dev/null
+++ b/examples/redis-pubsub.tcl
@@ -0,0 +1,61 @@
+#!/usr/bin/env jimsh
+
+# Requires the redis extension
+package require redis
+
+# A redis server should be running either on localhost 6379
+# or on the given host port
+#
+# Usage: redis-pubsub.tcl ?pub|sub? ?host:addr?
+#
+# If pub or sub is not given, forks and does both
+
+if {[lindex $argv 0] in {pub sub}} {
+ # Run in single process mode
+ set argv [lassign $argv op]
+} else {
+ # fork before connecting so that both processes don't share
+ # a connection
+ if {[os.fork] == 0} {
+ # child subscribes
+ set op sub
+ } else {
+ set op pub
+ }
+}
+
+try {
+ lassign $argv addr
+ if {$addr eq ""} {
+ set addr localhost:6379
+ }
+ set r [redis [socket stream $addr]]
+} on error msg {
+ puts [errorInfo $msg]
+ exit 1
+}
+
+if {$op eq "sub"} {
+ $r SUBSCRIBE chin
+ $r SUBSCRIBE chan
+
+ $r readable {
+ after cancel $afterid
+ set result [$r read]
+ puts "$op: $result"
+ set afterid [after 2000 {incr done}]
+ }
+ # If no message for 2 seconds, stop
+ set afterid [after 2000 {incr done}]
+ vwait done
+ puts "$op: quitting on idle"
+} else {
+ loop i 1 15 {
+ $r PUBLISH chan PONG$i
+ puts "$op: chan PONG$i"
+ after 250
+ $r PUBLISH chin PING$i
+ puts "$op: chin PING$i"
+ after 250
+ }
+}