我有一个TestController
范围的会话。它正在处理MyEvent
。
@Controller
@Scope("session")
@RequestMapping(value = "/test")
@Slf4j
public class TestController {
private String phone = getPhone();
private String getPhone() {
String phone = RandomGenerator.generateNumeric(4);
log.info("Phone is: {}", phone);
return phone;
}
@EventListener
public void listen(MyEvent event) {
log.info("Event in {} ({})", this, RandomGenerator.generateNumeric());
}
}
但是当我发布事件时,只有一个TestController类的实例得到了这个。但我想在所有实例中处理一个事件。你能帮帮我吗?
答案 0 :(得分:1)
您正在使用@Controller
声明@Scope("session")
,因此每个会话都会获得一个新的控制器bean。
然后,在代码的未公开部分中,您发布了一个事件,因此只有与发布者在同一会话中的控制器才能接收事件是合理的,因为其他控制器在其他会话中。
因此,由于每个会话都有一个控制器,因此该事件仅消耗一次。
解决方案是将范围从session
更改为singleton
(默认),而不是将状态存储在控制器中(该电话号码)。