我有一个整数列表和每个整数,我想从数据库中获取一个字符串值,并将其放入一个Map中,其中整数是来自父列表的整型值,并且字符串是从数据库中获取的字符串值。我也想要获取并行运行的字符串。RxJava:循环中的异步调用
这是我用RxJava实现的。我的代码工作,我得到了预期的结果,但我不认为提取名称并行运行。
public Observable<Map<Integer, String>> getVitalsForConnectedDevices(int accountId) {
List<Integer> ids = Lists.newArrayList(2, 3, 5);
return Observable<Map<Integer, String>> obs = Observable.from(ids)
.flatMap((Func1<Integer, Observable<Map.Entry<Integer, String>>>) integer
-> Observable.just(Maps.immutableEntry(integer, deviceDAO.getVitalName(integer)))
.subscribeOn(Schedulers.io()), 20)
.toMap(entry -> entry.getKey(), entry -> entry.getValue());
}
这里的getVitalName()方法
public String getVitalName(int vitalId) {
log.debug("id: " + vitalId);
String query = "SELECT name FROM vitals WHERE vital_id=?";
String name = v1JdbcTemplate.queryForObject(query, String.class, vitalId);
log.debug("name: " + name);
return name;
}
其打印从上述功能的调试语句顺序如下:
09-10-2017 02:05:37 DEBUG DeviceDAO:118 - id: 2
09-10-2017 02:05:37 DEBUG DeviceDAO:121 - name: Steps
09-10-2017 02:05:37 DEBUG DeviceDAO:118 - id: 3
09-10-2017 02:05:37 DEBUG DeviceDAO:121 - name: Floors
09-10-2017 02:05:37 DEBUG DeviceDAO:118 - id: 5
09-10-2017 02:05:37 DEBUG DeviceDAO:121 - name: Distance
如果它运行的同时,应该不会吧打印所有的ID的第一个名字?我在这里做错了什么?我如何让他们平行运行?
我觉得这篇文章会给你提供你需要的答案。即使这个例子也很相似:http://tomstechnicalblog.blogspot.com.by/2015/11/rxjava-achieving-parallelization.html –