Java 将代码重构为反应式风格

Java 将代码重构为反应式风格,java,reactive-programming,rx-java,Java,Reactive Programming,Rx Java,我正在开发的应用程序大量使用异步处理,我正在寻找一种更好的方法来组织代码 系统的外部输入通过servlet接收。此servlet收集的原始数据存储在队列中。线程池针对该队列运行,并将原始数据解析为结构化记录,然后将该记录保存到一组N个队列中的一个队列中。队列的选择应确保所有同类记录都进入同一队列。这N个队列由单个线程提供服务,每个线程将同类记录收集到一个集合中。每分钟都会有一个计划任务醒来,并将前一分钟收集的每种任务的所有记录写入文件 目前,这段代码是使用一堆队列、线程池和不断运行的Runnab

我正在开发的应用程序大量使用异步处理,我正在寻找一种更好的方法来组织代码

系统的外部输入通过servlet接收。此servlet收集的原始数据存储在队列中。线程池针对该队列运行,并将原始数据解析为结构化记录,然后将该记录保存到一组N个队列中的一个队列中。队列的选择应确保所有同类记录都进入同一队列。这N个队列由单个线程提供服务,每个线程将同类记录收集到一个集合中。每分钟都会有一个计划任务醒来,并将前一分钟收集的每种任务的所有记录写入文件

目前,这段代码是使用一堆队列、线程池和不断运行的Runnable来组织的,这使得逻辑很难遵循。我想将这段代码重构成上面描述的数据流更加明确的部分。我正在寻找实现这一目标的工具和方法

  • 像这样的工具有帮助吗?如果是,怎么做
  • 我还有别的办法吗?
根据您的描述,这里是一个RxJava示例。希望对你有帮助

public class TestServlet extends HttpServlet {

private static final PublishSubject<String> o = PublishSubject.<String>create();

public static Observable<String> getServletObservable() {
    return o.observeOn(Schedulers.computation());
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    synchronized (TestServlet.class) {
        o.onNext("value");
    }
}

}

class Foo {
public static void main(String[] args) {
    TestServlet.getServletObservable().map(new Func1<String, String>() {

        @Override
        public String call(String t1) {
            // do something
            return null;
        }

    }).groupBy(new Func1<String, String>() {

        @Override
        public String call(String t1) {
            // do something
            return null;
        }

    }).subscribe(new Observer<GroupedObservable<String, String>>() {

        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(GroupedObservable<String, String> group) {
            group.observeOn(Schedulers.io()).subscribe(new Observer<String>() {

                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(String t) {
                    // store t
                }

            });
        }

    });
}
}
公共类TestServlet扩展了HttpServlet{ private static final PublishSubject o=PublishSubject.create(); 公共静态可观察getServletObservable(){ 返回o.observeOn(Schedulers.computation()); } @凌驾 受保护的无效数据集(HttpServletRequest-req、HttpServletResponse-resp) 抛出ServletException、IOException{ 已同步(TestServlet.class){ o、 onNext(“价值”); } } } 福班{ 公共静态void main(字符串[]args){ TestServlet.getServletObservable().map(新的Func1(){ @凌驾 公共字符串调用(字符串t1){ //做点什么 返回null; } }).groupBy(新功能1(){ @凌驾 公共字符串调用(字符串t1){ //做点什么 返回null; } }).订阅(新观察员){ @凌驾 未完成的公共无效(){ } @凌驾 公共无效申报人(可丢弃的e){ } @凌驾 public void onNext(GroupedObservable组){ group.observeOn(Schedulers.io()).subscribe(newobserveon()){ @凌驾 未完成的公共无效(){ } @凌驾 公共无效申报人(可丢弃的e){ } @凌驾 公共void onNext(字符串t){ //商店 } }); } }); } }