简短的回答:这是在此配置(你有单EventBus
管理3个Vaadin应用程序,因此3 MainController
实例)正常和期望的行为。
通过定制Vaadin应用范围您的意思是this Vaadin addon范围是什么?
不管怎么说,这是简单的复制您的情况为原型作用域MainController豆和Vaadin应用程序是这样的:
public class SandpitApplication extends Application {
private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(SandpitApplication.class);
// https://vaadin.com/wiki/-/wiki/Main/Spring%20Integration#section-Spring+Integration-SpringContextHelperClass
private SpringContextHelper ctx;
@Override
public void init() {
// vaadin stuff
setTheme("common");
final Window mainWindow = new Window("Vaadin Sample Application");
setMainWindow(mainWindow);
// get your bean from spring
log.info("start [email protected]" + Integer.toHexString(hashCode()));
ctx = new SpringContextHelper(this);
// create application-wide bean
final MainController mainController = ctx.getBean("mainController");
mainWindow.addComponent(new Button("click to post", new Button.ClickListener() {
@Override public void buttonClick(final ClickEvent event) {
log.info("click on button");
EventBusFactory.getEventBusInstance().post(
new FacetAddedEventImpl("click-"
+ new SimpleDateFormat("HH:mm:ss").format(new Date())));
log.info(mainController);
}
}));
}
}
和MainController
类:
class MainController {
private static final Logger log = Logger.getLogger(MainController.class);
public MainController() {
log.info("creating [email protected]" + Integer.toHexString(hashCode()));
EventBusFactory.getEventBusInstance().register(this);
}
@Subscribe
public void addFacetEvent(final FacetAddedEvent event) {
final String signature = "[email protected]" + Integer.toHexString(hashCode()) + ": ";
log.info("addFacetEvent in " + signature + event);
// getTreeTableViewBuilder returns extended ArrayList with fancy add
getTreeTableViewBuilder().addFacetToList(signature + event.getData());
}
// plus other stuff like toString etc.
}
当你做到以下几点:
- 在您的浏览器(应用程序#1)中启动vaadin应用程序。
- 单击App1#按钮。
- 启动另一个应用程序(应用程序#2)。
- 单击App2#按钮
- 回到应用程序1选项卡。
- 单击App1#按钮。
你会得到下面的输出:
开始SandpitApplication @ 75a5555a
创建MainController @ 2e98f864
点击按钮//#1
addFacetEvent在MC @ 2e98f864:FacetAddedEventImpl @ 6b527dc6 {data:click-13:42:45}
MainController @ 2e98f864 {treeTableViewBuilder:[MC @ 2e98f864:click-13:42:45]}
start SandpitApplication @ 3f9e529
创建MainController @ 2f8d604f
点击按钮//#2
addFacetEvent在MC @ 2e98f864:FacetAddedEventImpl @ 36c1fc67 {数据:点击-13:42:47}
addFacetEvent在MC @ 2f8d604f:FacetAddedEventImpl @ 36c1fc67 {数据:点击-13:42:47}
MainController @ 2f8d604f {treeTableViewBuilder:[MC @ 2f8d604f:点击-13:42:47]}
点击按钮//#1
addFacetEvent在MC @ 2e98f864:FacetAddedEventImpl @ 42d32028 {data:click-13:42:49}
MC @ 2f8d604f中的addFacetEvent:FacetAddedEventImpl @ 42d32028 {data:click-13:42:49}
M ainController @ 2e98f864 {treeTableViewBuilder:[MC @ 2e98f864:点击-13:42:45,MC @ 2e98f864:点击-13:42:47,MC @ 2e98f864:点击-13:42:49]}
您现在应该看到单身人员EventBus
正在管理两个应用程序范围的MainController
bean,并且每个都是接收事件(因为它已通过全局EventBus
解决)。
试图猜测你想实现的,我会说,你需要创建应用程序范围内事件总线豆什么:
<bean id="eventBus" class="com.google.common.eventbus.EventBus"
scope="vaadinApplication" />
关于PS:我们在Vaadin项目中使用标准的番石榴广泛地说,不需要GWT版本。
这听起来很奇怪,也是意想不到的。您的听众是否三次获得_registered_,或者事件是否发布三次? – 2012-04-17 01:26:03
@Louis Wasserman我的订阅注释方法被调用3次,但事件只发布一次 – Spring 2012-04-17 07:23:47
您注册听众的方式和位置? – Ray 2012-04-17 14:55:37