使用Java进行大约20次HTTP调用并将数据传递到数据库

使用Java进行大约20次HTTP调用并将数据传递到数据库,java,concurrency,rx-java,Java,Concurrency,Rx Java,我有一个20个项目的集合,我将为这些项目创建一个循环,并进行API调用以获取数据,根据返回的数据,我将在数据库中进行更新。这个需求很简单,我能够用普通Java实现 现在,为了提高性能,我正在学习如何使用RxJava。我浏览了互联网上的许多文章,发现人们参考了异步http客户端库进行异步http调用,我发现该库已经过时,维护人员正在计划移交给其他人,RxJava库中给出的库也与2014年开发的库类似。由于我是RxJava新手,您能帮我找到正确的方法吗 我目前正在获取所有数据,并将其转换为如下所示的

我有一个20个项目的集合,我将为这些项目创建一个循环,并进行API调用以获取数据,根据返回的数据,我将在数据库中进行更新。这个需求很简单,我能够用普通Java实现

现在,为了提高性能,我正在学习如何使用
RxJava
。我浏览了互联网上的许多文章,发现人们参考了
异步http客户端
库进行异步http调用,我发现该库已经过时,维护人员正在计划移交给其他人,RxJava库中给出的库也与2014年开发的库类似。由于我是RxJava新手,您能帮我找到正确的方法吗

我目前正在获取所有数据,并将其转换为如下所示的可观测值

Observable<ENV> envs= Observable.fromIterable(allEnvs);
Observable envs=Observable.fromIterable(allEnvs);
我还需要得到一些帮助,比如上面的代码是否很好,或者我是否应该为可观察的结构创建以下代码,这是groovy中的代码片段,我必须用Java编写

val createObserver = Observable.create(ObservableOnSubscribe<String> { emitter ->
    emitter.onNext("Hello World")
    emitter.onComplete()
})
val createObserver=Observable.create(ObservableOnSubscribe{emitter->
emitter.onNext(“你好,世界”)
emitter.onComplete()
})

请帮助我选择最佳方法

假设http调用由下面的类表示:

public类HttpCall实现可调用{
私人期末考试i;
专用HttpCall(int i){
这个。i=i;
}
@凌驾
公共字符串调用(){
试一试{
《睡眠》(2000年);
}捕捉(中断异常e){
e、 printStackTrace();
}
return“Something for:”+i;
}
}
它等待2秒,然后发出一个字符串(http调用结果)

要组合来自不同http调用的所有项,我们可以使用
merge
操作符。但在此之前,我们需要使用
fromCallable
操作符将
Callable
转换为
observeable

void顺序(){
列出httpRequests=IntStream.range(0,20)
.mapToObj(HttpCall::new)
.map(可观察::fromCallable)
.collect(Collectors.toList());
可观察。合并(httpRequests)
.时间戳(时间单位:秒)
.subscribe(e->System.out.println(“运行时间:+e.time()+”--“+e.value()+”。在线程上执行:“+thread.currentThread().getName()));
}
由于所有请求都在同一个线程上执行,因此保持顺序:

已用时间:1602122218--用于:0的某些内容。在线程:main上执行
经过的时间:1602122220——用于:1的某些内容。在线程:main上执行
经过的时间:160212222——用于:2的某物。在线程:main上执行

如您所见,项目之间间隔2秒

要在其自己的线程中运行每个请求,我们需要告诉Rx每个调用都需要一个线程。简单,只需切换到建议的调度程序之一。IO是我们需要的(因为这是一个IO操作)

void并行({
列出httpRequests=IntStream.range(0,20)
.mapToObj(HttpCall::new)
.map(httpCall->Observable.fromCallable(httpCall)
.subscribeOn(Schedulers.io())
)//从IO池中获取线程
.collect(Collectors.toList());
可观察。合并(httpRequests)
.时间戳(时间单位:秒)
.subscribe(e->System.out.println(“运行时间:+e.time()+”--“+e.value()+”。在线程上执行:“+thread.currentThread().getName()));
}
这一次,订单没有得到保证,几乎同时生产:

运行时间:1602123707——用于:2.在线程RxCachedThreadScheduler-3上执行的内容
运行时间:1602123707--用于:0的内容。在线程RxCachedThreadScheduler-1上执行 运行时间:1602123707——用于:1.在线程RxCachedThreadScheduler-1上执行的内容


代码可以缩短为:

可观测范围(0,20)
.map(HttpCall::new)
.flatMap(httpCall->Observable.fromCallable(httpCall).subscribeOn(Schedulers.io())
.时间戳(时间单位:秒)
.subscribe(e->System.out.println(“运行时间:+e.time()+”--“+e.value()+”。在线程上执行:“+thread.currentThread().getName()));

merge
在后台使用
flatMap

假设http调用由下面的类表示:

public类HttpCall实现可调用{
私人期末考试i;
专用HttpCall(int i){
这个。i=i;
}
@凌驾
公共字符串调用(){
试一试{
《睡眠》(2000年);
}捕捉(中断异常e){
e、 printStackTrace();
}
return“Something for:”+i;
}
}
它等待2秒,然后发出一个字符串(http调用结果)

要组合来自不同http调用的所有项,我们可以使用
merge
操作符。但在此之前,我们需要使用
fromCallable
操作符将
Callable
转换为
observeable

void顺序(){
列出httpRequests=IntStream.range(0,20)
.mapToObj(HttpCall::new)
.map(可观察::fromCallable)
.collect(Collectors.toList());
可观察。合并(httpRequests)
.时间戳(时间单位:秒)
.subscribe(e->System.out.println(“运行时间:+e.time()+”--“+e.value()+”。在线程上执行:“+thread.currentThread().getName()));
}
由于所有请求都在同一个线程上执行,因此保持顺序:

已用时间:1602122218——用于:0的内容。在线程:main上执行
经过的时间:1602122220——差不多