gpt4 book ai didi

java - 使用 Guava EventBus 从不同线程发布事件

转载 作者:行者123 更新时间:2023-12-01 20:53:44 25 4
gpt4 key购买 nike

我在 Vaadin+Spring 项目中使用 Guava Eventbus,并且开始在从后台线程发布事件时遇到问题。

Eventbus 在包装类中实例化。对象使用主 UI 类中定义的静态方法与事件总线进行通信,以获取事件总线对象。这与 Vaadin 仪表板示例 ( DashboardEventBus ) 中建议的方式相同。

public class MainUI extends UI implements ViewDisplay
{
private EventBusWrapper eventbus_ = new EventBusWrapper();

public static EventBusWrapper GetEventBusWrapper()
{
return ((MainUI) getCurrent()).eventbus_;
}
}

问题出现在演示者/服务类中,我在其中创建新的线程类并启动线程。在 run 方法的 Runnable 实现中,我创建了另一个对象来完成一些工作。

public class SearchResultsPresenter extends AbstractPresenter<SearchResultView>
{
public SearchResultsPresenter()
{
EventBusWrapper.register(this);
}

@Subscribe
public void UserSearchRequested(Event.UserSearchRequestEvent e)
{
new UpdateContentComponentThread(e.GetSearchElem()).start();
}

@Subscribe
public void UserSearchAppendFoundElement(Event.UserSearchElementFound e)
{
if(e.GetElement().IsValid())
view_.AddElement(e.GetElement());
}

public class UpdateContentComponentThread extends Thread
{
private final Search searcher_;

UpdateContentComponentThread(SearchElement search)
{
searcher_ = new DefaultSearch(search);
}

@Override
public void run()
{
searcher_.Search();
}
}
}

它执行一些验证/检查并创建其他帮助器类。

public class DefaultSearch implements Search
{
private final Scraper scraper_;
...

@Override
public void Search()
{
if(!scraper_.IsConfigured())
return;
...
scraper_.FindElements();
}
}

然后,在 scraper 的 FindElements 主体内,我尝试使用 EventBusWrapper 中定义的静态 post 方法来发布事件。

public class HttpElementScraper extends WebScraper
{
...

@Override
public Collection<Element> FindElements()
{
...
Element elem = ...
Event.UserSearchElementFound e = new Event.UserSearchElementFound(elem);
EventBusWrapper.post(e);

return foundelements;
}
}

此时抛出 NullPointerException,我无法解决和帮助自己解决问题。

Exception in thread "Thread-10" java.lang.NullPointerException
at com.project.MainUI.GetEventBusWrapper(MainUI.java:109)
at com.project.events.EventBusWrapper.register(EventBusWrapper.java:24)
at com.project.service.search.scraper.HttpElementScraper.FindElements(HttpElementScraper.java:92)
at com.project.service.search.DefaultSearch.Search(DefaultSearch.java:38)
at com.project.view.search.SearchResultsPresenter$UpdateContentComponentThread.run(SearchResultsPresenter.java:71)

//我省略了不重要的代码行和注释。大多数与它们连接的组件和服务都是 UIscoped。

最佳答案

Vaadin 假定对 Vaadin 组件(及相关)实例的访问已正确同步。当使用传统的单线程请求-响应周期访问组件时,它会自动同步。

使用外部线程时,您需要使用 UI.access() 同步访问 Vaadin 组件的代码。例如:

getUI().access(() -> label.setValue("Hello"));

关于java - 使用 Guava EventBus 从不同线程发布事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42767342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com