I prefer that too, but my guess is it's a pendulum that isn't done swinging yet.

On 8/17/2015 1:41 PM, cogmission (David Ray) wrote:
Nice. I'm glad bare-bones tools are coming back in vogue and the apache-kitchen-sink-days appear to be over... :-)

On Mon, Aug 17, 2015 at 8:41 AM, Matthew Lohbihler <[email protected] <mailto:[email protected]>> wrote:

    Ok, well, while we're on the topic of nice Java tools for data
    streams, check out this: https://bitbucket.org/hooprai/tiny-tsdb


    On 8/17/2015 8:22 AM, cogmission (David Ray) wrote:
    For those seeing this for the first time, look in the quoted
    email history for the email from me showing the outline of RxJava
    operators...

    On Mon, Aug 17, 2015 at 7:20 AM, cogmission (David Ray)
    <[email protected] <mailto:[email protected]>>
    wrote:

        Omg! I just found this!

        On each of the above operator links (seen in red if you're
        using Rich Text or HTML email client), there is a link on the
        landing page where you can go to their awesome marble
        diagrams (which the have for each operator)...

        Except, this one is interactive! So you can move around the
        marbles and see the effect in their output (see how the
        transformation functions change!)

        Check it out! http://rxmarbles.com/#zip

        Cheers,
        David

        On Sun, Aug 16, 2015 at 10:04 PM, cogmission (David Ray)
        <[email protected]
        <mailto:[email protected]>> wrote:


              Hi Matt,

            I'm only responding in order to avoid what may possibly
            be a missed opportunity, and I don't want you or anyone
            else who may see the term "Observable" and mistake it for
            a simple publish/subscribe pattern that has been seen
            before. On the contrary, this library is extremely
            powerful, easy on the eyes and with some subtle usage,
            can exert extreme power and flexibility in its usage.

            For example:

            Say you have a service where you receive a message for
            the retrieval of a document on the web. In servicing that
            request you need to make an asynchronous query to
            back-end services, and then say that service needs to
            aggregate several formats from a db, and other streaming
            sources, so you nest yet another blocking request to
            receive those items in a synchronized fashion and maybe
            it doesn't end there? Maybe there is an additional stop
            along the way where another nested asynchronous call
            needs to be made? Now if one of those connections
            experiences undue latency or the service is unavailable
            for some reason, it is extremely laborious to try and
            percolate that exception back up to the original caller.
            RxJava handles the bubbling of exceptions from deeply
            nested calls back to the original call site.

            That's just one example of its use.

            Then there are the 100 or so operators that can be
            performed on each Observable. Each function returns an
            Observable that "emits" one or more items or "streams" of
            data. And each Observable can be "operated upon"
            mathematically or combined/reduced/transformed etc. And
            yes, if your Observables are composed in a "Functional"
            manner, meaning they don't mutate or convey state, you
            are isolated from a lot of concurrency issues that you
            would otherwise have to handle.

            I'm not saying that a reckless developer can't still get
            themselves in trouble - that is true with any
            breakthrough library. I'm just saying this is quite an
            exceptional offering in the Java language. Other
            languages might have something similar - but this is also
            being used in the C# camp too (and Ruby, Python, Scala,
            Clojure, C++, Swift, JRuby, Kotlin etc.) - Entitled
            ReactiveX as seen here: http://reactivex.io/languages.html

            This is also different from the Java 8 Streams offering
            because it can do both Pull (like Java 8 Streams) and
            Push oriented (its major use case) query patterns. As a
            matter of fact, I'm sure the authors of the Java 8
            release got a lot of their ideas from this library!

            Take a look at some of its operators:


              Operators By Category


                Creating Observables

            Operators that originate new Observables.

              * *|Create|*
                <http://reactivex.io/documentation/operators/create.html> —
                create an Observable from scratch by calling observer
                methods programmatically
              * *|Defer|*
                <http://reactivex.io/documentation/operators/defer.html> —
                do not create the Observable until the observer
                subscribes, and create a fresh Observable for each
                observer
              * *|Empty|/|Never|/|Throw|*
                
<http://reactivex.io/documentation/operators/empty-never-throw.html> —
                create Observables that have very precise and limited
                behavior
              * *|From|*
                <http://reactivex.io/documentation/operators/from.html> —
                convert some other object or data structure into an
                Observable
              * *|Interval|*
                <http://reactivex.io/documentation/operators/interval.html> —
                create an Observable that emits a sequence of
                integers spaced by a particular time interval
              * *|Just|*
                <http://reactivex.io/documentation/operators/just.html> —
                convert an object or a set of objects into an
                Observable that emits that or those objects
              * *|Range|*
                <http://reactivex.io/documentation/operators/range.html> —
                create an Observable that emits a range of sequential
                integers
              * *|Repeat|*
                <http://reactivex.io/documentation/operators/repeat.html> —
                create an Observable that emits a particular item or
                sequence of items repeatedly
              * *|Start|*
                <http://reactivex.io/documentation/operators/start.html> —
                create an Observable that emits the return value of a
                function
              * *|Timer|*
                <http://reactivex.io/documentation/operators/timer.html> —
                create an Observable that emits a single item after a
                given delay


                Transforming Observables

            Operators that transform items that are emitted by an
            Observable.

              * *|Buffer|*
                <http://reactivex.io/documentation/operators/buffer.html> —
                periodically gather items from an Observable into
                bundles and emit these bundles rather than emitting
                the items one at a time
              * *|FlatMap|*
                <http://reactivex.io/documentation/operators/flatmap.html> —
                transform the items emitted by an Observable into
                Observables, then flatten the emissions from those
                into a single Observable
              * *|GroupBy|*
                <http://reactivex.io/documentation/operators/groupby.html> —
                divide an Observable into a set of Observables that
                each emit a different group of items from the
                original Observable, organized by key
              * *|Map|*
                <http://reactivex.io/documentation/operators/map.html> —
                transform the items emitted by an Observable by
                applying a function to each item
              * *|Scan|*
                <http://reactivex.io/documentation/operators/scan.html> —
                apply a function to each item emitted by an
                Observable, sequentially, and emit each successive value
              * *|Window|*
                <http://reactivex.io/documentation/operators/window.html> —
                periodically subdivide items from an Observable into
                Observable windows and emit these windows rather than
                emitting the items one at a time


                Filtering Observables

            Operators that selectively emit items from a source
            Observable.

              * *|Debounce|*
                <http://reactivex.io/documentation/operators/debounce.html> —
                only emit an item from an Observable if a particular
                timespan has passed without it emitting another item
              * *|Distinct|*
                <http://reactivex.io/documentation/operators/distinct.html> —
                suppress duplicate items emitted by an Observable
              * *|ElementAt|*
                <http://reactivex.io/documentation/operators/elementat.html> —
                emit only item /n/ emitted by an Observable
              * *|Filter|*
                <http://reactivex.io/documentation/operators/filter.html> —
                emit only those items from an Observable that pass a
                predicate test
              * *|First|*
                <http://reactivex.io/documentation/operators/first.html> —
                emit only the first item, or the first item that
                meets a condition, from an Observable
              * *|IgnoreElements|*
                
<http://reactivex.io/documentation/operators/ignoreelements.html> —
                do not emit any items from an Observable but mirror
                its termination notification
              * *|Last|*
                <http://reactivex.io/documentation/operators/last.html> —
                emit only the last item emitted by an Observable
              * *|Sample|*
                <http://reactivex.io/documentation/operators/sample.html> —
                emit the most recent item emitted by an Observable
                within periodic time intervals
              * *|Skip|*
                <http://reactivex.io/documentation/operators/skip.html> —
                suppress the first /n/ items emitted by an Observable
              * *|SkipLast|*
                <http://reactivex.io/documentation/operators/skiplast.html> —
                suppress the last /n/ items emitted by an Observable
              * *|Take|*
                <http://reactivex.io/documentation/operators/take.html> —
                emit only the first /n/ items emitted by an Observable
              * *|TakeLast|*
                <http://reactivex.io/documentation/operators/takelast.html> —
                emit only the last /n/ items emitted by an Observable


                Combining Observables

            Operators that work with multiple source Observables to
            create a single Observable

              * *|And|/|Then|/|When|*
                
<http://reactivex.io/documentation/operators/and-then-when.html> —
                combine sets of items emitted by two or more
                Observables by means of |Pattern|and
                |Plan| intermediaries
              * *|CombineLatest|*
                
<http://reactivex.io/documentation/operators/combinelatest.html> —
                when an item is emitted by either of two Observables,
                combine the latest item emitted by each Observable
                via a specified function and emit items based on the
                results of this function
              * *|Join|*
                <http://reactivex.io/documentation/operators/join.html> —
                combine items emitted by two Observables whenever an
                item from one Observable is emitted during a time
                window defined according to an item emitted by the
                other Observable
              * *|Merge|*
                <http://reactivex.io/documentation/operators/merge.html> —
                combine multiple Observables into one by merging
                their emissions
              * *|StartWith|*
                <http://reactivex.io/documentation/operators/startwith.html> —
                emit a specified sequence of items before beginning
                to emit the items from the source Observable
              * *|Switch|*
                <http://reactivex.io/documentation/operators/switch.html> —
                convert an Observable that emits Observables into a
                single Observable that emits the items emitted by the
                most-recently-emitted of those Observables
              * *|Zip|*
                <http://reactivex.io/documentation/operators/zip.html> —
                combine the emissions of multiple Observables
                together via a specified function and emit single
                items for each combination based on the results of
                this function


                Error Handling Operators

            Operators that help to recover from error notifications
            from an Observable

              * *|Catch|*
                <http://reactivex.io/documentation/operators/catch.html> —
                recover from an |onError| notification by continuing
                the sequence without error
              * *|Retry|*
                <http://reactivex.io/documentation/operators/retry.html> —
                if a source Observable sends an
                |onError| notification, resubscribe to it in the
                hopes that it will complete without error


                Observable Utility Operators

            A toolbox of useful Operators for working with Observables

              * *|Delay|*
                <http://reactivex.io/documentation/operators/delay.html> —
                shift the emissions from an Observable forward in
                time by a particular amount
              * *|Do|*
                <http://reactivex.io/documentation/operators/do.html> —
                register an action to take upon a variety of
                Observable lifecycle events
              * *|Materialize|/|Dematerialize|*
                
<http://reactivex.io/documentation/operators/materialize-dematerialize.html> —
                represent both the items emitted and the
                notifications sent as emitted items, or reverse this
                process
              * *|ObserveOn|*
                <http://reactivex.io/documentation/operators/observeon.html> —
                specify the scheduler on which an observer will
                observe this Observable
              * *|Serialize|*
                <http://reactivex.io/documentation/operators/serialize.html> —
                force an Observable to make serialized calls and to
                be well-behaved
              * *|Subscribe|*
                <http://reactivex.io/documentation/operators/subscribe.html> —
                operate upon the emissions and notifications from an
                Observable
              * *|SubscribeOn|*
                <http://reactivex.io/documentation/operators/subscribeon.html> —
                specify the scheduler an Observable should use when
                it is subscribed to
              * *|TimeInterval|*
                <http://reactivex.io/documentation/operators/timeinterval.html> 
—
                convert an Observable that emits items into one that
                emits indications of the amount of time elapsed
                between those emissions
              * *|Timeout|*
                <http://reactivex.io/documentation/operators/timeout.html> —
                mirror the source Observable, but issue an error
                notification if a particular period of time elapses
                without any emitted items
              * *|Timestamp|*
                <http://reactivex.io/documentation/operators/timestamp.html> —
                attach a timestamp to each item emitted by an Observable
              * *|Using|*
                <http://reactivex.io/documentation/operators/using.html> —
                create a disposable resource that has the same
                lifespan as the Observable


                Conditional and Boolean Operators

            Operators that evaluate one or more Observables or items
            emitted by Observables

              * *|All|*
                <http://reactivex.io/documentation/operators/all.html> —
                determine whether all items emitted by an Observable
                meet some criteria
              * *|Amb|*
                <http://reactivex.io/documentation/operators/amb.html> —
                given two or more source Observables, emit all of the
                items from only the first of these Observables to
                emit an item
              * *|Contains|*
                <http://reactivex.io/documentation/operators/contains.html> —
                determine whether an Observable emits a particular
                item or not
              * *|DefaultIfEmpty|*
                
<http://reactivex.io/documentation/operators/defaultifempty.html> —
                emit items from the source Observable, or a default
                item if the source Observable emits nothing
              * *|SequenceEqual|*
                
<http://reactivex.io/documentation/operators/sequenceequal.html> —
                determine whether two Observables emit the same
                sequence of items
              * *|SkipUntil|*
                <http://reactivex.io/documentation/operators/skipuntil.html> —
                discard items emitted by an Observable until a second
                Observable emits an item
              * *|SkipWhile|*
                <http://reactivex.io/documentation/operators/skipwhile.html> —
                discard items emitted by an Observable until a
                specified condition becomes false
              * *|TakeUntil|*
                <http://reactivex.io/documentation/operators/takeuntil.html> —
                discard items emitted by an Observable after a second
                Observable emits an item or terminates
              * *|TakeWhile|*
                <http://reactivex.io/documentation/operators/takewhile.html> —
                discard items emitted by an Observable after a
                specified condition becomes false


                Mathematical and Aggregate Operators

            Operators that operate on the entire sequence of items
            emitted by an Observable

              * *|Average|*
                <http://reactivex.io/documentation/operators/average.html> —
                calculates the average of numbers emitted by an
                Observable and emits this average
              * *|Concat|*
                <http://reactivex.io/documentation/operators/concat.html> —
                emit the emissions from two or more Observables
                without interleaving them
              * *|Count|*
                <http://reactivex.io/documentation/operators/count.html> —
                count the number of items emitted by the source
                Observable and emit only this value
              * *|Max|*
                <http://reactivex.io/documentation/operators/max.html> —
                determine, and emit, the maximum-valued item emitted
                by an Observable
              * *|Min|*
                <http://reactivex.io/documentation/operators/min.html> —
                determine, and emit, the minimum-valued item emitted
                by an Observable
              * *|Reduce|*
                <http://reactivex.io/documentation/operators/reduce.html> —
                apply a function to each item emitted by an
                Observable, sequentially, and emit the final value
              * *|Sum|*
                <http://reactivex.io/documentation/operators/sum.html> —
                calculate the sum of numbers emitted by an Observable
                and emit this sum


                Backpressure Operators

              * *backpressure operators*
                <http://reactivex.io/documentation/operators/backpressure.html> 
—
                strategies for coping with Observables that produce
                items more rapidly than their observers consume them


                Connectable Observable Operators

            Specialty Observables that have more precisely-controlled
            subscription dynamics

              * *|Connect|*
                <http://reactivex.io/documentation/operators/connect.html> —
                instruct a connectable Observable to begin emitting
                items to its subscribers
              * *|Publish|*
                <http://reactivex.io/documentation/operators/publish.html> —
                convert an ordinary Observable into a connectable
                Observable
              * *|RefCount|*
                <http://reactivex.io/documentation/operators/refcount.html> —
                make a Connectable Observable behave like an ordinary
                Observable
              * *|Replay|*
                <http://reactivex.io/documentation/operators/replay.html> —
                ensure that all observers see the same sequence of
                emitted items, even if they subscribe after the
                Observable has begun emitting items


            On Sun, Aug 16, 2015 at 8:29 PM, Matthew Lohbihler
            <[email protected]
            <mailto:[email protected]>> wrote:

                Hi David,

                It's nice to see that this pattern has been
                formalized, but this isn't really anything terribly
                new. I've been using observables to do things like
                rollups and other data stream analysis for years now,
                just not with this particular package.

                Also, note that Futures/Promises don't really compete
                with Observables. Futures are good for chaining
                arbitrary asynchronous events, Observables for
                processing streams of homogenous objects. (But is it
                true that the Java Future impl is not very useful. I
                had to develop my own for what i thought was a very
                straightforward use case.)

                Finally, there is nothing inherently thread safe
                about Observables (not that anyone said they were...
                just saying...). When using the same Observable
                instance in a multi-threaded context, you still have
                to manage synchonization on your own if the context
                doesn't somehow do it for you.

                Regards,
                m@


                On 8/15/2015 11:56 PM, cogmission (David Ray) wrote:
                ...and Their Use In HTM.java's Network API (NAPI)

                Hi Everybody,

                I wanted to share a one-page short but very well
                explained tutorial on composing asynchronous
                workflows using RxJava.

                Due to the availability of "Big Data", Multicore
                Processors, Cloud Computing and emerging concepts of
                Streaming Workflows; tools like "Hadoop", "Spark"
                etc. have come to the forefront as a means of
                optimizing concurrency and parallel architectures.
                Likewise, on a smaller scale, mastering the tools of
                Streaming Data utilization is essential in order to
                be ready when the future comes visiting upon us.

                Enter RxJava...

                As you may or may not know, HTM.java's Network API
                was constructed using RxJava Observables which are a
                way of composing units of work in such a way where
                they can be used asynchronously or
                non-asynchronously without blocking. This also
                allows you to seamlessly "tie in" the NAPI in your
                own applications using chains of Observable items.

                Unlike Java "Futures" which only return a single
                item, RxJava Observables (which also can use
                Futures) can return a "streaming" flow of items in a
                non-blocking fashion; this allows one to fully
                utilize any Threads in use by letting them be
                continuously active throughout their life cycle.
                Better yet, it is very lightweight has no outside
                dependencies and can be used with a multitude of
                languages!!

                Netflix, uses RxJava and is its original sponsor and
                creator. It is a very exciting new concept that is
                sweeping the Java developer ranks, and this is one
                of the best tutorials on the subject I have found.

                http://docs.couchbase.com/developer/java-2.0/observables.html

                Enjoy!

                David

-- /With kind regards,/
                David Ray
                Java Solutions Architect
                *Cortical.io <http://cortical.io/>*
                Sponsor of: HTM.java
                <https://github.com/numenta/htm.java>
                [email protected] <mailto:[email protected]>
                http://cortical.io




-- /With kind regards,/
            David Ray
            Java Solutions Architect
            *Cortical.io <http://cortical.io/>*
            Sponsor of: HTM.java <https://github.com/numenta/htm.java>
            [email protected] <mailto:[email protected]>
            http://cortical.io <http://cortical.io/>




-- /With kind regards,/
        David Ray
        Java Solutions Architect
        *Cortical.io <http://cortical.io/>*
        Sponsor of: HTM.java <https://github.com/numenta/htm.java>
        [email protected] <mailto:[email protected]>
        http://cortical.io




-- /With kind regards,/
    David Ray
    Java Solutions Architect
    *Cortical.io <http://cortical.io/>*
    Sponsor of: HTM.java <https://github.com/numenta/htm.java>
    [email protected] <mailto:[email protected]>
    http://cortical.io




--
/With kind regards,/
David Ray
Java Solutions Architect
*Cortical.io <http://cortical.io/>*
Sponsor of: HTM.java <https://github.com/numenta/htm.java>
[email protected] <mailto:[email protected]>
http://cortical.io <http://cortical.io/>

Reply via email to