Spring启动时的事件监听器

时间:2016-04-14 09:14:05

标签: java spring events event-handling

我有一个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类的实例得到了这个。但我想在所有实例中处理一个事件。你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

您正在使用@Controller声明@Scope("session"),因此每个会话都会获得一个新的控制器bean。

然后,在代码的未公开部分中,您发布了一个事件,因此只有与发布者在同一会话中的控制器才能接收事件是合理的,因为其他控制器在其他会话中。

因此,由于每个会话都有一个控制器,因此该事件仅消耗一次

解决方案是将范围从session更改为singleton(默认),而不是将状态存储在控制器中(该电话号码)。