我有一个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
方法吗?”
答案 0 :(得分:2)
不直接。您必须以某种方式提供序列化或使用toSerialized()
方法并与返回的Subject<T, R>
实例进行通信。
PublishSubject<Integer> ps = PublishSubject.create();
Subject<Integer, Integer> subject = ps.toSerialized();
subject.subscribe(System.out::println);
subject.onNext(1);
答案 1 :(得分: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
对此进行操作,并根据需要采取适当的措施。