[英]Rxjava - Can I invoke `Subject.onNext` method from different threads?
我有一個Spring Web服務器,我想為每個請求我的控制器的N(例如10個)客戶端創建一個聊天室。
每個服務器請求都有自己的線程,如何收集每個N請求並為它創建一個房間? 我認為Rxjava有一個解決方案,所以如何實現這個,如果我不能這樣做,最好的解決方案是什么?
在@ pavan-kumar回答的幫助下,我創建了這個:
@RestController
public class GameController {
private final PublishSubject<Integer> subject;
private AtomicInteger counter = new AtomicInteger(0);
@Autowired
public GameController(PublishSubject<Integer> subject) {
this.subject = subject;
}
@PostConstruct
public void init() {
subject.buffer(10).subscribe(
integers -> {
StringBuilder builder = new StringBuilder("[ ");
for (Integer integer : integers) {
builder = builder.append(integer).append(", ");
}
String s = builder.append("]").toString();
System.out.println(s);
});
}
@RequestMapping(value = "/game", method = RequestMethod.GET)
public void findNewGame() {
int i = counter.addAndGet(1);
subject.onNext(i);
}
}
所以當前的問題是“我可以從不同的線程調用Subject.onNext
方法嗎?”
不是直接的。 您必須以某種方式提供序列化或使用toSerialized()
方法並與返回的Subject<T, R>
實例進行通信。
PublishSubject<Integer> ps = PublishSubject.create();
Subject<Integer, Integer> subject = ps.toSerialized();
subject.subscribe(System.out::println);
subject.onNext(1);
雖然用例對我來說不是很清楚,但下面的方法可能會有所幫助。
Every request to server has its own thread
- 使用在所有線程之間共享的static
Observable
。 可能是每次新用戶建立連接時都可以調用onNext。
一旦你有這樣的Observable
,你可以通過buffer
訂閱它,如下所示。
Observable.range(1, 50).buffer(10).subscribe(n -> System.out.println(n.get(0)));
Observable.range(1, 50)
類似於static
Observable
,它在每次建立連接時發出事件。 buffer
負責將所有項目合並到項目List
,並在發出所述項目數量(10)時發出一個列表。 您可以subscribe
此內容並根據需要采取適當的措施。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.