2016-04-14 56 views
0

我有一個TestController作用域會話。它正在處理MyEventSpring引導中的事件監聽器

@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

什麼的所有實例?你要求會話範圍,所以它會發布當前會話的事件.... –

回答

1

您聲明的@Controller@Scope("session"),所以你得到一個新的控制器bean爲每個會話。

然後,在代碼的未公開部分中,您發佈了一個事件,因此只有與發佈者在同一會話中的控制器接收該事件是合理的,因爲其他控制器在其他會話中。

因此,由於您有一個控制器每個會話,事件只消耗一次

解決方案是將範圍從session更改爲singleton(默認值),並且不在控制器(該電話號碼)中存儲狀態。