我有一個整數列表和每個整數,我想從數據庫中獲取一個字符串值,並將其放入一個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 –