我有一个GWT单元树,用于显示CMS的文件结构.我正在使用AsyncDataProvider从我创建的自定义RPC类加载数据.我还有一个Web Socket系统,它将从也在系统中工作的其他客户端广播事件(文件创建,重命名,移动,删除等).
我想要解决的是当我收到其中一个事件时,我如何正确更新我的Cell Tree?
我想这个问题类似于在页面上有两个我的Cell Tree实例,它们呈现相同的服务器端数据,并希望确保当用户更新一个时,另一个更新也通过使用EventBus.
我觉得这应该很简单,但我现在花了大约6个小时才没有进展.我的代码包含在下面:
注意:我没有使用RequestFactory,即使它看起来像我是我的自定义RPC框架.此外,FileEntity只是一个文件的简单表示,其名称可以访问getName().
private void drawTree() {
// fileService is injected earlier on and is my own custom rpc service
TreeViewModel model = new CustomTreeModel(new FileDataProvider(fileService));
CellTree tree = new CellTree(model, "Root");
tree.setAnimationEnabled(true);
getView().getWorkspace().add(tree);
}
private static class CustomTreeModel implements TreeViewModel {
// I am trying to use a single AsyncDataProvider so I have a single point of loading data which I can manipulate (Not sure if this is …Run Code Online (Sandbox Code Playgroud) 我正在使用番石榴事件总线.我有一个类似服务器的对象应该一直在运行,监听要发布给b us的事件.所以在junit测试中(MyObject是测试中的类),我在它自己的线程中创建它来模拟这个并阻止阻塞:
@Test
public void test() {
EventBus eventBus = new EventBus();
Thread thread= new Thread() {
@Override
public void run()
{
logger.debug("Creating new thread");
MyObject myObject = new MyObject(eventBus);
}
};
thread.start();
...
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,myObject是在自己的线程Thread1中创建的.然后,我在测试中将事件发布到事件总线:
eventBus.post(triggerObject);
Run Code Online (Sandbox Code Playgroud)
我发现的奇怪的事情是,我在MyObject类中的订阅方法的所有操作/日志记录都在主线程中再次执行.myObject等待来自某些其他部分的响应,这会阻止我的测试,因为它在主线程中.为什么会这样?我在EventBus或Java线程上做错了吗?
我记得几年前我使用静态初始化程序来调用类级别的设置操作.我记得它有非常奇怪的行为,我只是决定避开他们.也许是因为我弄乱了最上层的订单或成为新手.但我遇到了重新审视它们的需要,我想确保没有一种更简洁的方法.
我知道它不时髦,但我经常有数据驱动的类,它们维护从数据库导入的静态实例列表.
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) 我有一个注册到事件总线的splashscreen Fragment:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
Run Code Online (Sandbox Code Playgroud)
如果屏幕进入自动锁定(或任何其他可以调用onStop的事件),则容器活动将进入onStop,并且该片段不再能够接收(网络)事件.我正在考虑将 "取消注册"逻辑移动到onDestroy方法.这是个好主意吗?
无法解析方法registerSticky(this)代替寄存器(this)
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
Run Code Online (Sandbox Code Playgroud)
我在Gradle中试过'org.greenrobot:eventbus:3.0.0'和'de.greenrobot:eventbus:3.0.0-beta1'.不知道为什么这种方法没有出现
我的应用程序在很大程度上依赖于本地广播,因为每次活动调用都会调用广播注册方法,所以移动到任何事件总线都很好.
使用本地广播管理器的两个主要问题.
我认为事件总线将改善我的应用程序的整体执行和性能.
我有一个单件服务类,它按照设定的时间表从服务器中提取数据.一旦客户端收到数据,我就触发bus.post(new NewServerResponseEvent());(http://square.github.io/otto/)
然后在我的片段中我这样做:
@Override
public void onResume() {
super.onResume();
eventBus.register(this);
}
@Override
public void onPause() {
super.onPause();
eventBus.unregister(this);
}
@Subscribe
public void handleNewServerData(NewServerResponseEvent e) {
refreshView();
}
Run Code Online (Sandbox Code Playgroud)
只要我在我的测试设备上进行开发时,一切都运行得非常顺利.一旦我构建了一个发布版本并将其放入Play商店,handleNewServerData()就永远不会调用该函数.
我无法理解这一点.将整个事物作为发布版本运行会有什么不同?是否有可能在另一个线程中发生的事情无法发布给我的订阅者?
有人能指出我正确的方向吗?
提前致谢
我正在尝试按照以下 avro 模式创建 JSON 字符串,用于十进制值。 https://avro.apache.org/docs/1.8.2/spec.html#Logical+Types
{
"name": "score",
"type": "bytes",
"logicalType": "decimal",
"precision": 10,
"scale": 5
}
Run Code Online (Sandbox Code Playgroud)
价值
"score":3.4,
Run Code Online (Sandbox Code Playgroud)
我得到了例外
Caused by: org.apache.avro.AvroTypeException: Expected bytes. Got VALUE_NUMBER_FLOAT.
Run Code Online (Sandbox Code Playgroud)
如果我给出“\u0000”而不是 3.4,那么它可以工作,但这是 0 的表示,我将如何获得 3.4 的表示?现在我正在创建硬编码的 JSON 字符串,但将来我必须将输出转换为十进制,我如何在 Scala 中做到这一点。
有没有办法将值转换为十进制逻辑格式?
我正在尝试构建 Quarkus 应用程序,并将外部类用作 EventBus 中的消息。
@ConsumeEvent("VAVR")
Uni<Try<String>> tryUni(String message) {
return Uni.createFrom().item(Try.of(() -> {
throw new TestException("From VAVR", 400);
}));
}
Run Code Online (Sandbox Code Playgroud)
我在构建时得到的是
2020-04-18 19:35:59,076 ERROR [io.qua.application] (main) Failed to start application: java.lang.ClassNotFoundException: io.vavr.control.Try<java.lang.String>
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:322)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:275)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:322)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:275)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:398)
at io.quarkus.deployment.steps.VertxProcessor$build38.deploy_0(VertxProcessor$build38.zig:1123)
at io.quarkus.deployment.steps.VertxProcessor$build38.deploy(VertxProcessor$build38.zig:36)
at io.quarkus.runner.ApplicationImpl.doStart(ApplicationImpl.zig:194)
at io.quarkus.runtime.Application.start(Application.java:90)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.quarkus.runner.bootstrap.StartupActionImpl.run(StartupActionImpl.java:99)
at io.quarkus.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:60)
at io.quarkus.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:236)
at io.quarkus.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:39)
at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:131)
at …Run Code Online (Sandbox Code Playgroud) 我正在使用微服务架构构建我的第一个应用程序。我将主要使用 Flask 在 Python 中工作。
我正在考虑实现事件/消息总线来协调服务之间的操作。我打算实现的一些服务是:Auth、Users、Posts 和 Chat。该应用程序有两个实体(“用户”和“组”),几乎每个服务都使用它们。我为每个服务都有一个单独的数据库,每个数据库都有自己的users表groups来管理特定于该服务的用户/组数据。现在,当我考虑创建新用户之类的事件时,每个服务都需要在表中创建一个新条目users,这就是我考虑使用事件总线的原因。
我阅读了这篇文章,其中讨论了 CQRS 和使用 HTTP (REST) 进行服务之间的外部通信,同时使用事件总线进行内部通信。服务处理 (HTTP) 请求,并发出有关数据更改的事件(例如,通过 Auth 服务创建新用户)。其他服务使用可能触发其他进程(和更多事件)的事件。
我困惑的是如何实际实现(在 Python 中)一个服务,该服务侦听 HTTP 请求以及一组订阅通道中的新事件。我知道您需要使用像 redis/rabbitMQ 这样的工具,但是是否可以在同一进程中处理两种类型的请求,或者您是否需要运行两个服务器(一个用于 REST 请求,另一个用于事件处理)?
另外,如果您对上述一般方法/架构有任何意见,我洗耳恭听。