Java 是否可以使用非函数式语言构建反应式应用程序?

Java 是否可以使用非函数式语言构建反应式应用程序?,java,functional-programming,apache-camel,reactive-programming,Java,Functional Programming,Apache Camel,Reactive Programming,我想了解,反应式应用程序宣言背后的原则是否可以使用非功能性语言实现 有人说,由于FP使用不可变状态和自由副作用函数,它们更容易实现并发、分布式和弹性系统 但是,我们如何以Java为例实现这一点呢 有些框架,比如ApacheCamel,有一些组件可以使用,比如Camel RX和Camel SEDA 这些框架够了吗 我将尝试澄清我的问题: 我认为反应式编程是一种新的编程范式,而新的编程范式需要新的工具和框架 函数式语言以不同的方式处理对象,这就是为什么有很多关于FRP处理基于事件和异步的事物的文章

我想了解,反应式应用程序宣言背后的原则是否可以使用非功能性语言实现

有人说,由于FP使用不可变状态和自由副作用函数,它们更容易实现并发、分布式和弹性系统

但是,我们如何以Java为例实现这一点呢

有些框架,比如ApacheCamel,有一些组件可以使用,比如Camel RXCamel SEDA

这些框架够了吗

我将尝试澄清我的问题:

我认为反应式编程是一种新的编程范式,而新的编程范式需要新的工具和框架

函数式语言以不同的方式处理对象,这就是为什么有很多关于FRP处理基于事件和异步的事物的文章

但是现在,回到Java或其他面向对象语言,让我们考虑一下Web应用程序:

  • 我们如何创建一个java web应用程序来利用好的 基于事件的前端
  • 然后,这些事件以平滑的方式将信息异步传递到后端
  • 后端可以轻松地扩展,并且具有弹性
  • 我知道,使用java、Servlet和EJB创建一个能够满足这些需求的应用程序是可能的,但我的问题是,我们能做得不同吗? 更接近被动的方法

    我是这样想的:

    • 前端是一个很好的ajax框架,它使后端的“信息传递”更加顺畅
    • 在后端,一种使用框架或库(Camel SEDA ou Camel RX)并行执行事情的方法

    你认为这是一个好方法吗?

    好吧,如果你看一下你的参考资料,你会发现,“functional”一词根本没有出现在那里。相反,有4个特定标准用于定义什么是“反应式”应用程序:

    • 事件驱动
    • 可伸缩
    • 弹性的
    • 响应的
    Java中没有任何东西禁止您实现这些特性中的任何一个(除非在非常罕见、非常高性能的场景中使用“响应性”)。而且Java中没有任何东西禁止您编写受限于不可变对象和无副作用函数的代码(事实上,一些库,例如,鼓励您使用不可变对象以及具体化函数)


    RxJava之类的框架可以通过提供一个面向数据流的事件驱动系统,进一步帮助您编写满足宣言中定义的标准的应用程序,这基本上是最新的。反应式编程不是新的,但对大多数人来说是新的。它只是数据流的另一个名称,自20世纪60年代以来一直存在。反应式宣言只是描述数据流和反应式编程的最佳品质的一种方式

    函数式语言当然是不需要的,也不是一个巨大的库。我已经实现了许多数据流系统。它们中的大多数都是助手函数的集合,而不是大多数人所说的“库”。这实际上取决于您希望在系统中使用什么类型的功能

    数据流是一个非常“广泛”的话题。该系统可以包括许多很好的功能,也可以只包含基本功能。数据流的核心是数据控制执行。这与“控制流”(在C#和Java等所有主流语言中使用)形成对比,在“控制流”中,您可以告诉计算机何时、何地以及如何处理数据。最常见的数据流形式是管道模型。。。通过链接(也称为管道、导线或圆弧)顺序连接到另一个的一系列长方体(或节点)


    我刚刚开始研究可用于Java数据流编程的库,所以现在无法给出具体的答案。RxJava似乎是Java中数据流的当前“名牌”,所以我将从这里开始。在我即将出版的书()中,我将用一整节的篇幅介绍通用语言(包括Java)中可用的数据流库。

    定义反应式是第一步。例如:

    反应式程序中的每一个状态都定义了如何计算它,运行时管理它们的计算,而不是发出修改共享状态的命令;运行时传播派生状态。如果您已经编写了电子表格公式,那么您已经完成了反应式编程

    ReactiveSax源于SAX的一个基本缺陷,该缺陷使其与反应式编程模型不兼容。SAX的思想非常适合于反应式编程,因为它是一个推送模型——事件被推送到管道中的下一个事件,它进行一些处理并将内容推送到下一个事件,等等。不幸的是,XMLReader接口定义了一个解析方法,该方法在到达实际的解析器之前调用解析链;该方法采用InputSource参数,该参数必须提供InputStream。这就是缺陷所在——InputStream是一个阻塞I/O,从根本上说是一个阻塞拉动。这与SAX的推送模型背道而驰,不适合使用Future或Task进行反应式编程。如果一组解析器阻塞了所有等待输入的线程,并且它们提取输入的能力依赖于程序的其他位推送数据(比如说,推送数据到java.nio.Pipe或java.io.PipedWriter),那么您将面临死锁

    一个可观察的XmlReader将允许您订阅它,并将为您迭代Xml文档,在读取每个节点时通知您。使用这种方法的程序员可以很容易地编写反应式LINQ表达式,以在Xml中的特定节点上进行选择,从而生成看起来和感觉上都很像LINQtoXML的代码,但具有XmlReader的所有性能优势

    怒族游戏