Rxjava - 我可以从不同的线程调用`Subject.onNext`方法吗?

时间:2017-01-30 20:17:37

标签: java spring multithreading rx-java

我有一个Spring Web服务器,我想为每个请求我的控制器的N(例如10个)客户端创建一个聊天室。

对服务器的每个请求都有自己的线程,如何收集每个N请求并为其创建一个房间?我认为Rxjava有一个解决方案,所以如何实现这一点,如果我不能这样做,什么是最好的解决方案?

更新1:

在@ 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方法吗?”

2 个答案:

答案 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对此进行操作,并根据需要采取适当的措施。