snipplrCallback({"id":28364,"title":"jruby-jetlang-pingpong-example","source":"
require<\/span> "java"<\/span><\/div><\/li> require<\/span> "jetlang-0.2.0.jar"<\/span><\/div><\/li> <\/div><\/li> include_class "org.jetlang.fibers.ThreadFiber"<\/span><\/div><\/li> include_class "org.jetlang.channels.MemoryChannel"<\/span><\/div><\/li> include_class "org.jetlang.channels.BatchSubscriber"<\/span><\/div><\/li> include_class "java.util.concurrent.CountDownLatch"<\/span><\/div><\/li> include_class "java.util.concurrent.TimeUnit"<\/span><\/div><\/li> <\/div><\/li> class<\/span> PingPongChannels<\/div><\/li> def<\/span> ping<\/div><\/li> return<\/span> @ping_channel<\/span> ||<\/span>= MemoryChannel.new<\/span><\/div><\/li> end<\/span><\/div><\/li> def<\/span> pong<\/div><\/li> return<\/span> @pong_channel<\/span> ||<\/span>= MemoryChannel.new<\/span><\/div><\/li> end<\/span><\/div><\/li> def<\/span> stop<\/div><\/li> return<\/span> @stop_channel<\/span> ||<\/span>= MemoryChannel.new<\/span><\/div><\/li> end<\/span><\/div><\/li> end<\/span><\/div><\/li> <\/div><\/li> class<\/span> Ping<\/div><\/li> def<\/span> initialize(<\/span>channels, fiber, count)<\/span><\/div><\/li> @channels<\/span> = channels<\/div><\/li> @consumer<\/span> = fiber<\/div><\/li> @count<\/span> = count<\/div><\/li> end<\/span><\/div><\/li> def<\/span> start<\/div><\/li> on_receive = Proc<\/span>.new<\/span> do<\/span> |<\/span>message|<\/span><\/div><\/li> if<\/span> @count<\/span> ><\/span> 0<\/span><\/div><\/li> publish_ping(<\/span>message)<\/span><\/div><\/li> else<\/span><\/div><\/li> @channels<\/span>.stop<\/span>.publish<\/span>(<\/span>""<\/span>)<\/span><\/div><\/li> @consumer<\/span>.dispose<\/span><\/div><\/li> end<\/span><\/div><\/li> end<\/span><\/div><\/li> @channels<\/span>.ping<\/span>.subscribe<\/span>(<\/span>@consumer, on_receive)<\/span><\/div><\/li> <\/div><\/li> @consumer<\/span>.start<\/span><\/div><\/li> end<\/span><\/div><\/li> def<\/span> publish_ping(<\/span>message)<\/span><\/div><\/li> puts<\/span> message<\/div><\/li> @count<\/span> -<\/span>= 1<\/span><\/div><\/li> @channels<\/span>.pong<\/span>.publish<\/span>(<\/span>"From ping to pong"<\/span>)<\/span><\/div><\/li> end<\/span><\/div><\/li> end<\/span><\/div><\/li> <\/div><\/li> class<\/span> Pong<\/div><\/li> def<\/span> initialize(<\/span>channels, fiber)<\/span><\/div><\/li> @channels<\/span> = channels<\/div><\/li> @consumer<\/span> = fiber<\/div><\/li> end<\/span><\/div><\/li> def<\/span> start<\/div><\/li> on_receive = Proc<\/span>.new<\/span> do<\/span> |<\/span>message|<\/span><\/div><\/li> puts<\/span> message<\/div><\/li> @channels<\/span>.ping<\/span>.publish<\/span>(<\/span>"From pong to ping"<\/span>)<\/span><\/div><\/li> end<\/span><\/div><\/li> @channels<\/span>.pong<\/span>.subscribe<\/span>(<\/span>@consumer, on_receive)<\/span><\/div><\/li> on_stop = Proc<\/span>.new<\/span> {<\/span>|<\/span>message|<\/span> @consumer<\/span>.dispose<\/span>}<\/span><\/div><\/li> @channels<\/span>.stop<\/span>.subscribe<\/span>(<\/span>@consumer, on_stop)<\/span><\/div><\/li> @consumer<\/span>.start<\/span><\/div><\/li> end<\/span><\/div><\/li> end<\/span><\/div><\/li>