需要一些关于如何在Java中使用Akka提供的EventBus的建议(而不是Scala!).网站上的文档似乎不完整:http://doc.akka.io/docs/akka/2.0.1/java/event-bus.html
据我所知,应该创建actor以对特定消息做出反应,例如:
final ActorSystem actorSystem = ActorSystem.create("ServerEvents");
final ActorRef actor = actorSystem.actorOf(new Props(SeverEventHandler.class));
actorSystem.eventStream().subscribe(actor,ServerMessage.class);
Run Code Online (Sandbox Code Playgroud)
但现在还不清楚如何向事件总线发送消息.
有人可以分享一些好的教程/示例/等?
在我的Android应用程序中,我使用Otto作为事件总线,使用Dagger进行依赖注入.
在Otto的用户指南和许多博客文章中,建议使用注入来获取总线单例.我已经做了一段时间,但最近我更加怀疑如果注入总线比使用简单的静态单例有任何优势.
使用注入时,我必须注入我希望能够在总线上发布UI事件的每个自定义View或ViewHolder.尤其是匕首,在我需要公共汽车的地方注入每个班级似乎有点笨拙.当然,我可以通过构造函数或setter方法传递总线,但是如果您考虑具有许多不同视图类型的适配器,那也可能有点笨拙.
我注意到注入总线没有任何好处.在Otto的情况下,注入了一个具体的实现(Bus的一个实例),并且永远不会改变.由于订阅的工作方式,包装Otto进行解耦对于思考是没有任何意义的.
那么,有没有人看到注入奥托的任何优点,我没有看到?
我正在使用 vertx3
我需要使用 redis 来设置和获取值。(Redis 将来可能会更改为其他内容)
我正在为我的实现寻找最佳实践设计。
我正在研究 vertx 集群,我需要通过 eventbus 检索消息提取消息并插入到 Redis 中。
另一方面,我可以通过网络获取请求,也可以提取消息并将它们插入到 redis 中
两种选择:
我是否应该有一个“redis-verticle”来通过总线获取消息并写入它们。
我应该创建一个“侦听器垂直”来保存 DAO,它将保存将写入它们的 RedisRepo 对象。
我也将能够处理网络调用并持有这个 DAO 对象
如果我在 spring-app 上,我会创建一个包含 RedisRepo 的 DAO 并将其注入我的服务层,但在这里我们得到了 eventbus,所以我不确定。
(顺便说一下,redis 数据源我被改成了别的东西,所以我得考虑通用包装器)
1.
public class RedisRepoVerticle extends AbstractVerticle {
...
public void start() {
client = new RedisClient("localhost", 6379);
connection = client.connect();
...
vertx.eventBus().consumer("redis-operation", (handler) -> {
{
JsonObject msg = new JsonObject(handler.body().toString());
//write straight to Redis
}
});
}
2.
public class RedisMessageListener extends AbstractVerticle …Run Code Online (Sandbox Code Playgroud) 我有点混淆的使用onEvent,onEventMainThread,onEventBackgroundThread和onEventAsync在Greenrobot的EventBus 3.0
从我在文档中看到的:
onEvent与ThreadMode.POSTING(默认)一起使用onEventMainThread 与...一起使用 ThreadMode.MAINonEventBackgroundThread 与...一起使用 ThreadMode.BackgroundThreadonEventAsync 与...一起使用 ThreadMode.ASYNC但是在事件从后台线程发布的情况下:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MyEvent event) {
// some UI manipulation
}
Run Code Online (Sandbox Code Playgroud)
具有与以下完全相同的行为:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(MyEvent event) {
// some UI manipulation
}
Run Code Online (Sandbox Code Playgroud)
和:
@Subscribe
public void onEventMainThread(MyEvent event) {
// some UI manipulation
}
Run Code Online (Sandbox Code Playgroud)
抛出,CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch …
java android event-bus greenrobot-eventbus greenrobot-eventbus-3.0
Activity/Fragment当我从服务器得到响应时,我正在使用EventBus通知.到目前为止一切都运行良好,但是当我在同一个Fragment或两个网络中使用两个网络呼叫时会出现问题Activity.问题是onEvent(String response)从服务器获取两个响应的相同方法.反应call 1不同于call 2.
我提出了一个解决方案 - 我添加CallType了NetworkReqest但我无法通知活动/片段有关网络调用,因为post()只需要一个参数.
这是相关的代码 -
public class NetworkRequest {
EventBus eventBus = EventBus.getDefault();
public void stringParamRequest(String url, final Map<String, String> params,String callType) {
StringRequest jsonObjRequest = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
eventBus.post(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("volley", "Error: " + error.getMessage());
eventBus.post(error);
}
}) { …Run Code Online (Sandbox Code Playgroud) 我的情况是:
我理解vert.x事件总线的范围比我的用例要广泛得多.
我想到了一个类似于akka的行为:当你分发时,你必须为你的消息提供序列化,如果你保持本地引用被传递.
有没有什么可以让我在Vert.x中做到这一点?
当我的鼠标光标进入并离开我的VueJS组件时,分别调用以下方法.
光标进入和离开组件时调用的方法:
// located in "methods" section of my Vue component file
onMouseEnter() {
window.Event.$emit("mouse-entered", this.index);
console.log("Mouse entered");
},
onMouseLeave() {
window.Event.$emit("mouse-left", this.index);
console.log("Mouse left");
},
Run Code Online (Sandbox Code Playgroud)
预计,当我的光标进入并离开组件时,这就是我的控制台的样子(每次发出一个事件):
然而,真正奇怪的是,在Vue开发工具中,我看到每次光标进入并离开组件时都会发出重复事件:
鉴于这种相互矛盾的信息,我不确定该相信什么.刷新页面有时会消除开发工具中的重复事件,但我总是在我的控制台中获得单个唯一的事件,这是我想要的行为.
有谁知道这里发生了什么,我应该接受什么作为真相的来源?
下面是我的main.js文件中声明和初始化我的Vue实例的方法:
// As far as I can tell, duplicated Vue instances are not being created here on page refresh
let app;
// global event bus
window.Event = new Vue();
console.log("Event bus created");
/* This section ensures the firebase auth object isn't in …Run Code Online (Sandbox Code Playgroud) 单击按钮后,我正在使用 EventBus 从一个片段导航到另一个片段。有时且不可重现,会出现以下错误:
Fatal Exception: java.lang.IllegalStateException: Fragment already added: FragmentQuestion3_2{82d0763} (e57d5f9c-c80b-4f99-a4f4-e844bdabdef5) id=0x7f0a0487}
at androidx.fragment.app.FragmentStore.addFragment(FragmentStore.java:67)
at androidx.fragment.app.FragmentManager.addFragment(FragmentManager.java:1563)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:405)
at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2167)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1990)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1945)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1847)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7211)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
Run Code Online (Sandbox Code Playgroud)
这个问题有一些答案,但自从我使用 EventBus 以来,对我没有任何帮助。
这是显然已经添加的片段:
public class FragmentQuestion3_2 extends BaseFragment {
private ViewModelQuestionAnswer viewModel;
private String category;
private ImageView imageCategory;
private TextView question3;
PagerAdapter viewPagerAdapter;
public NonSwipeAbleViewPager optionAnswerViewPager;
private boolean isFragmentLoaded = false;
public FragmentQuestion3_2() {
// Required empty …Run Code Online (Sandbox Code Playgroud) 我记得几年前我使用静态初始化程序来调用类级别的设置操作.我记得它有非常奇怪的行为,我只是决定避开他们.也许是因为我弄乱了最上层的订单或成为新手.但我遇到了重新审视它们的需要,我想确保没有一种更简洁的方法.
我知道它不时髦,但我经常有数据驱动的类,它们维护从数据库导入的静态实例列表.
public class StratBand {
private static volatile ImmutableList<StratBand> stratBands = importFromDb();
private final int minRange;
private final int maxRange;
private static ImmutableList<StratBand> importFromDb() {
//construct list from database here
}
//constructors, methods, etc
}
Run Code Online (Sandbox Code Playgroud)
当我有几十个像这样的表驱动类时,这个模式非常简洁(是的,我知道它将类与一个数据/实例源紧密结合).
但是,当我发现Google Guava的优点时,我希望在发布特定事件时使用EventBus更新静态列表.我会创建一个静态的最终布尔变量,只是为了调用初始化注册的静态方法.
public class StratBand {
private static volatile ImmutableList<StratBand> stratBands = importFromDb();
private static final boolean subscribed = subscribe();
private final int minRange;
private final int maxRange;
private static ImmutableList<StratBand> importFromDb() {
//construct list from database here
}
//constructors, methods, etc
private …Run Code Online (Sandbox Code Playgroud) 我们拥有基于微服务架构的应用程序的第一个版本。我们使用 REST 进行外部和内部通信。
现在我们要从CP(CAP定理)*切换到AP,使用消息总线进行微服务之间的通信。关于如何基于 Kafka、RabbitMQ 等创建事件总线的信息有很多,但我找不到任何 REST 和消息传递组合的最佳实践。例如,您创建了一个汽车服务,您需要添加不同的汽车组件。为此,将 REST 与 POST 请求一起使用会更有意义。另一方面,预订汽车的服务对于基于事件的方法来说是一项很好的任务。
当您拥有不同的字典和业务逻辑功能时,您是否有类似的方法?你如何结合它们?只是分别支持这两种方法?或者用一种方法统一它们?
* 对于第一个版本,我们同意选择一致性和分区容错性。但是现在可用性对我们来说变得更加重要。
event-bus ×10
java ×6
android ×4
vert.x ×2
akka ×1
architecture ×1
cap-theorem ×1
dagger ×1
guava ×1
javascript ×1
otto ×1
rest ×1
vue-devtools ×1
vue.js ×1
vuejs2 ×1
web-services ×1