标签: event-bus

使用Spring IoC在Guava EventBus中自动注册bean

假设我的应用程序中有一个语言更改事件接口(它基于Vaadin):

public interface ILanguageChangeListener{
    @Subscribe onLanguageChange(LanguageChangeEvent event);
}
Run Code Online (Sandbox Code Playgroud)

我有很多bean实现了这个用@Component注释的接口,因此它们可以在Spring IoC中使用.我还有一个EventBus bean:

<bean id="languageSwitcher" class="com.google.common.eventbus" scope="session" />
Run Code Online (Sandbox Code Playgroud)

现在,在从IoC获取任何bean的实例之后,我还必须得到一个languageSwitcher的实例,并在其中注册newely创建的bean:

languageSwitcher.register(myNewBean);
Run Code Online (Sandbox Code Playgroud)

为了接收这个事件.有可能以某种方式告诉IoC我想在每个实现ILanguageChangeListener的新bean上调用languageSwitcher bean的register方法吗?

java spring vaadin guava event-bus

5
推荐指数
1
解决办法
5514
查看次数

Android中的greenrobot EventBus发布活动

通过使用EventBus,我需要在Activity中发布一个事件(MyEvent)并在Android中的另一个Activity中接收该事件.我尝试了greenrobot EventBus性能测试项目,但无法做到这一点.

我在ActivitySubscriber中尝试过

MyEvent event = new MyEvent();
EventBus.getDefault().post(event);
Run Code Online (Sandbox Code Playgroud)

并试图在接收事件ActivityReceiver

EventBus.getDefault().register(this);

public void onEvent(MyEvent event){
....
}
Run Code Online (Sandbox Code Playgroud)

但是我无法收到这个活动.任何人都可以让我知道我在哪里做错了吗?

android event-bus

5
推荐指数
1
解决办法
2万
查看次数

在模型回调的Rails控制器中触发操作

我试图围绕Rails中的服务器发送事件进行直播.我有一个Rake任务侦听文件更改,这会将记录添加到数据库中.一旦添加,我想发送一个SSE到前端.

但是,模型不能向前端发送事件,控制器负责.如何告诉我的控制器将新记录添加到数据库中?

到目前为止我的(破碎)解决方案:在模型中使用带有回调的EventBus,after_save它会通知更改并要求控制器监听这些消息:

require 'reloader/sse'
class SseController < ApplicationController
  include ActionController::Live

  def index
    response.headers['Content-Type'] = 'text/event-stream'
    sse = Reloader::SSE.new(response.stream)
    EventBus.subscribe(:added) do |payload|
      sse.write({ /* payload */ })
    end
  rescue IOError
  ensure
    sse.close
  end
end
Run Code Online (Sandbox Code Playgroud)

我认为我的请求在收到事件之前就结束了,这意味着它永远不会在de subscribe块中结束.这是正确的方法,如果是这样,我错过了什么?

event-bus server-sent-events ruby-on-rails-4

5
推荐指数
1
解决办法
684
查看次数

奇怪的"无法发送事件"和"没有订阅者注册事件"问题

我一直试图调试这个东西几个小时,我真的不能在这里看到问题.

这是我的MainActivity.这里要寻找的主要是ArrayList<Servico>作为Servico自定义对象.我创建了一个简单的"事件"类 - ServicoActual只有一个Servico对象引用(和构造函数/ getter):

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.SearchManager;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import net.pedromoreira.billper.events.ServicoActual;

import java.util.ArrayList;
import java.util.Locale;

import de.greenrobot.event.EventBus;


public class MainActivity extends Activity {
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle …
Run Code Online (Sandbox Code Playgroud)

android event-bus

5
推荐指数
1
解决办法
1万
查看次数

什么时候应该调用removeStickyEvent(...)?

我在Android上使用GreenRobot EventBus lib.

有人能告诉我,调用removeStickyEvent(...)的最佳做法是什么?Up-Action,后退按钮,......?

感谢你们.

android fragment event-bus android-activity

5
推荐指数
1
解决办法
1446
查看次数

EventBus使用,内存和架构

我开始在我的应用程序中使用EventBus并且它非常好用,它解决了很多问题并简化了代码,并且在所有线程和所有内容的应用程序中传播都很棒,但我觉得我可能会滥用使用事件.

现在一切都很好,我正在测试强大的设备,应用程序响应非常好,但我还有很多编码要做,我开始质疑自己将如何影响有太多事件触发全部应用程序.

所以问题是对于那些有使用该库经验的人,如果我的应用程序中有很多事件存在问题,如果存在与使用此事件相关的一些已知内存问题.我试图明智地使用它,但很难不在你的架构中包含它很多,因为它是一个非常好的功能.无论如何,如果你对这个主题有什么想说的话会很好,因为我有很多编码要做,如果我的架构出错就会出现问题,并且由于与事件有关的一些问题而不得不回去做更改.

PD.我说的是原生Android应用程序,有很多网络

谢谢

android event-bus

5
推荐指数
1
解决办法
1118
查看次数

RxJava用新的observable无限重试

我正在使用Rx-ified API for vertx,这个问题必须做一个潜在的无限重试 - 直到成功循环我想实现但是有困难.我是RxJava的新手.

这是我想做的事情:

  1. 使用vertx消息总线向另一个vertx组件发送请求
  2. 只要我等待响应超时,请重新发出请求
  3. 一旦我对请求做出响应,检查结果,如果没有可用的,请等待一段时间,然后在步骤1重新开始

第一个问题

我遇到的第一个问题是如何完成步骤2).

如果您熟悉vert.x Rx api,这就是在上面的步骤1)中发出请求的意思:

vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject );
Run Code Online (Sandbox Code Playgroud)

上面的代码返回一个Observable实例,该实例将发出响应或错误(例如,如果有超时).Observable将永远不会再发出任何东西(或者每次订阅时它总会发出完全相同的东西,我不知道哪个).

RxJava重试运算符似乎不起作用

vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
     .retry()
Run Code Online (Sandbox Code Playgroud)

我认为为了发出重试,我可以使用RxJava的retry()运算符,我尝试过,但由于源可观察的性质,这样做完全没有任何有用的效果.没有新的请求消息被发送,因为唯一被"重试"的是订阅原始源,它永远不会发出任何不同的东西.

RxJava重试当运算符似乎不起作用

vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
     .retryWhen( error -> {
        return _vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
      })
Run Code Online (Sandbox Code Playgroud)

所以我想我可以使用RxJava的retryWhen()运算符,它允许我在根observable发出错误时发出第二个observable.我想,第二个可观测量可能与上面第一步产生初始观察者的代码相同.

但是,retryWhen()运算符(请参阅文档)不允许第二个observable发出错误而不会因错误而结束订阅.

所以,我无法弄清楚如何在这个链的第一部分内建立一个潜在的无限重试循环.

我必须在这里遗漏一些东西,但我无法确定它是什么.

第二个问题

vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
     // imagine that retryWhen() accomplishes an infinite retry
     .retryWhen( error -> {
        return _vertx.eventBus().<JsonObject>sendObservable( ... )
      })
     .flatMap( response -> {
        // inspect response, if it has …
Run Code Online (Sandbox Code Playgroud)

java control-flow event-bus vert.x rx-java

5
推荐指数
1
解决办法
1633
查看次数

如何配置Vert.x事件总线以跨Docker容器群集工作?

在我目前的设置中,我使用的是Hazelcast集群管理器的默认多播选项.当我链接我的容器化Vertx模块的实例(通过Docker网络链接)时,我可以看到他们成功创建了Hazelcast集群.但是,当我尝试从一个模块在事件总线上发布事件时,另一个模块不会对它做出反应.我不确定Hazelcast群集中的网络设置如何与事件总线的网络设置相关.

目前,我为每个Vert.x模块配置了以下编程配置,每个模块都部署在一个docker容器中.

ClusterManager clusterManager = new HazelcastClusterManager();
VertxOptions vertxOptions = new VertxOptions()
            .setClustered(true)
            .setClusterManager(clusterManager);
vertxOptions.setEventBusOptions(new EventBusOptions()
            .setClustered(true)
            .setClusterPublicHost("application"));
Run Code Online (Sandbox Code Playgroud)

Vert.x Core手册指出我可能需要配置clusterPublicHostclusterPublicPort事件总线,但我不确定它们与一般网络拓扑有何关联.

java event-bus hazelcast vert.x docker

5
推荐指数
1
解决办法
4770
查看次数

退订RxJava2 / RxAndroid PublishSubject

我正在尝试用RxAndroid替换EventBus。

我希望可分页的片段订阅/取消订阅事件源,这些片段的创建和丢弃相对较快,具体取决于用户滑动到新页面的速度。

在EventBus中,我能够添加修饰的回调方法(例如@Subscribe(threadMode = ThreadMode.MAIN)),并在片段的onStart / onStop方法中注册/注销。

现在,使用RxJava2 PublishSubject在类中创建一个对象

public static PublishSubject<List<Long>> m_psUpdatedDays = PublishSubject.create();
public static void publishUpdatedDays(List<Long> lDay) {
    m_psUpdatedDays.onNext(lDay);
}
Run Code Online (Sandbox Code Playgroud)

并通过Fragment的onStart方法调用以下内容来订阅该发布者在另一个类中的操作:

m_psUpdatedDays.observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<List<Long>>() {
    @Override public void onSubscribe(Disposable d) {}
    @Override public void onNext(List<Long> longs) {
      ...
      Update Fragment UI here
      ...
    }
    @Override public void onError(Throwable e) {}
    @Override public void onComplete() {}
});
Run Code Online (Sandbox Code Playgroud)

我的问题是,当onStop系统调用Fragment的方法时,如何取消订阅该新的Observer ?

我是否需要存储Disposable获取到的对象,onSubscribe然后.dispose()onStop方法中对其进行调用?

publish-subscribe event-bus rx-android rx-java2

5
推荐指数
1
解决办法
1119
查看次数

Google Guava EventBus和事件处理程序中的异常

Guava EventBus文档说 "一般情况下,处理程序不应抛出.如果这样做,EventBus将捕获并记录异常.这很少是错误处理的正确解决方案,不应该依赖;它仅用于帮助在开发过程中发现问题."

如果您知道可能发生某些异常,则可以使用EventBus注册SubscriberExceptionHandler并使用它来处理这些异常.

但是如果发生未处理的异常会发生什么?通常情况下,我希望一个未处理的异常"冒泡"调用链.使用SubscriberExceptionHandler时,我可以访问事件处理程序中抛出的原始异常,我只想重新抛出它.但我无法弄清楚如何.

那么,无论是否使用SubscriberExceptionHandler,如何确保事件处理程序中的意外异常不会被"吞噬"?

任何帮助将不胜感激.

java guava event-bus

4
推荐指数
2
解决办法
2779
查看次数