我使用vaadin spring IOC google guava eventbus。参考资料建议将guava eventbus用作singleton。但当我这样做时,我有以下问题:;
>
假设我同时在3个不同的浏览器上运行应用程序,那么我的应用程序有3个不同的实例。
然后,例如,当我按下一个浏览器上的按钮并触发一个事件时,我注意到我的带有@subscribe注释的相关侦听器方法被调用了3次!
这是我期望的正常行为吗,因为我将eventbus用作单例?如果不是,这是怎么回事?MainController是一个具有自定义Vaadin应用程序范围的Spring托管bean
class MainController{
public MainController() throws DAOException, Exception {
EventBusFactory.getEventBusInstance().register(this);
}
@Subscribe
public void addFacetEvent(FacetAddedEvent event) throws DAOException {
getTreeTableView().addToList(event.getData());
}
}
class EventBusFactory{
public static EventBus getEventBusInstance() {
if(eventBus==null){
eventBus=new EventBus();
}
return eventBus;
}
}
P. s我也在瓦丁犹豫,我应该使用番石榴事件总线还是番石榴gwt事件总线?
谢啦
简短回答:这是此配置中的正常和预期行为(您有三个Vaadin应用程序,因此有三个由单个事件总线管理的主控制器实例)。
自定义Vaadin应用范围是指此Vaadin插件的范围吗?
无论如何,使用原型范围的MainController bean和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 SandpitApplication@" + 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 MainController@" + Integer.toHexString(hashCode()));
EventBusFactory.getEventBusInstance().register(this);
}
@Subscribe
public void addFacetEvent(final FacetAddedEvent event) {
final String signature = "MC@" + 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.
}
执行以下操作时:
您将获得以下输出:
开始SandpitApplication@75a5555a
正在创建MainController@2e98f864
单击按钮//#1在中添加FacetEventMC@2e98f864: FacetAddedEventImpl@6b527dc6{数据:click-13:42:45}
MainController@2e98f864{treeTableViewBuilder:[MC@2e98f864:单击-13:42:45]}
开始SandpitApplication@3f9e529
正在创建MainController@2f8d604f
单击按钮//#2在中添加FacetEventMC@2e98f864: FacetAddedEventImpl@36c1fc67{数据:单击-13:42:47}
在中添加FacetEventMC@2f8d604f: FacetAddedEventImpl@36c1fc67{数据:click-13:42:47}
MainController@2f8d604f{treeTableViewBuilder:[MC@2f8d604f:click-13:42:47]}
单击按钮//#1
在中添加FacetEventMC@2e98f864: FacetAddedEventImpl@42d32028{数据:单击-13:42:49}
在中添加FacetEventMC@2f8d604f: FacetAddedEventImpl@42d32028{数据:click-13:42:49}
MainController@2e98f864{treeTableViewBuilder:[MC@2e98f864:单击-13:42:45,MC@2e98f864:单击-13:42:47,MC@2e98f864:单击-13:42:49]}
您现在应该看到,singleton事件总线正在管理两个应用程序范围的主控制器bean,每个bean都在接收事件(因为它是由全局事件总线解决的)。
为了猜测您想要实现什么,我想说您需要创建应用程序范围的事件总线bean:
<bean id="eventBus" class="com.google.common.eventbus.EventBus"
scope="vaadinApplication" />
关于P.S.:我们在Vaadin项目中广泛使用标准番石榴,不需要GWT版本。
本文向大家介绍PowerShell一次打开多个文件的方法,包括了PowerShell一次打开多个文件的方法的使用技巧和注意事项,需要的朋友参考一下 有时候,我们想通过PowerShell脚本一次性打开多个文件,尤其是相同后缀名的所有文件。我们来写一个函数,函数名为Open-File,通过传递一个*.后缀给此函数,实现一次性打开所有的此后缀的文件。 在调用之前,先来解释一下。首先定义一个函数名为Op
二次开发:
安装YApi 1.创建工程目录 mkdir yapi && cd yapi git clone https://github.com/YMFE/yapi.git vendors --depth=1 # 或者下载 zip 包解压到 vendors 目录 2.修改配置 cp vendors/config_example.json ./config.json # 复制完成后请修改相关配置 vi ./c
请参考环境准备 自定义修改归档策略 修改open-falcon/graph/rrdtool/rrdtool.go 重新编译graph组件,并替换原有的二进制 清理掉原来的所有rrd文件(默认在/home/work/data/6070/下面) 插件机制 找一个git存放公司的所有插件 通过调用agent的/plugin/update接口拉取插件repo到本地 在portal中配置哪些机器可以执行哪些
开源协议申明 Yearning 遵循AGPL协议。(不含审核引擎项目Juno) 该协议具体约束及权利如下: 被授权人权利 被授权人有权利使用、复制、修改、合并、散布 被授权人义务 未经原作者授权不得将Yearning 用于任何商业目的。包括通过网络提供任何基于Yearning的商业服务。 如果你修改了代码,需要在被修改的文件中说明。 如二次开发并公布的情况下(内部使用不在该条款之内),该软件必须为
api v0.2