我喜欢将invokeLater()工作单元发送到AWT EDT 的简单性.有一个类似的机制可以将工作请求发送到后台线程(例如SwingWorker),但据我所知,这些机制没有任何类型的事件排队和调度机制,这是invokeLater()所依赖的.
所以相反,我最终给我的后台线程一个阻塞队列,其他线程向其发送消息,并且该线程实际上运行一个接收循环,阻塞直到消息到达.
事实上,这可能正是人们如何在后台线程中实现类似EDT的行为(或者它会是什么?).另一方面,我喜欢简单地悬挂在那里的线程的简单性,只要碰巧从天空中的一些看不见的事件调度队列发送到它就处理"工作水滴".Java是否提供了创建这种"事件驱动的工作线程"的方法?或者是消息排队正确的方法来执行此操作吗?而且相关的是invokeLater(),消息传递技术有缺点吗?
我正在尝试开发一个基于处理某些事件和生成数据的系统。每个事件将包含(可能)几个不同的字段,每个侦听器将处理其中的一些。我有以下两种方法
在事件生成类中,我将注册多个事件侦听器,每个侦听器侦听事件特定字段的一个特定值,例如:
public class MicroListener implements Listener {
public void processEvent(Event e){
if(e.getName().equals(registeredName)) { ... }
}
Run Code Online (Sandbox Code Playgroud)这很诱人,因为处理是在对象本身内完成的,并且没有集中处理事件,而是允许每个对象处理信息。缺点(可能是致命的)是每个事件(几十万个)都必须广播给所有听众,而实际上只有一小部分会对其进行处理。从长远来看,它可能会产生巨大的性能冲击......
一个集中式侦听器,它将侦听所有事件并对其采取行动,并将处理委托给相应的事件处理器,例如:
public class CentralListener implements Listener {
Map<String, Processor> processorsByName;
public void processEvent(Event e){
processorsByName.get(e.getName()).process(e);
}
}
Run Code Online (Sandbox Code Playgroud)这会更快,但它需要单独的映射或处理器集合用于事件的任何其他部分,例如检查事件 ID 的处理器等。方法 1 中不是这种情况。因为我们将简单地生成另一组侦听器并注册它们与事件生成类。
大家觉得这些怎么样?它们是否有意义,还是您宁愿建议完全不同?
这是一个小小的理论问题.想象一下装满传感器的设备.现在,如果传感器x检测到某些东西,应该发生一些事情.同时,如果检测到其他东西,例如两个传感器检测到两个不同的东西,则该设备必须表现不同.
从网页设计(所以javascript)我学习了事件,例如(使用jquery)$(".x").on("click", function(){})或angularjs $scope.watch("name_of_var", function()).
是否有可能在C中复制此行为,而不使用复杂的库?
谢谢.
当你有一个引用另一个视图并监听其事件的视图时,事件处理程序很好,这对于解耦和可重用性是完美的.
问题虽然有时我有没有被引用的视图所以我使用Event Aggregator这是一个全局通知来知道是否发生了什么......但是当我只是想听孩子们无法参考的视图时,这似乎不对DOM层次结构中的冒泡事件.
但是让我说我有一个视图层次结构,如:
当ModalView触发事件时,我想在ParentView中知道...我不能使用事件冒泡,因为ModalView不在同一个DOM层次结构中,所以我应该在这种情况下使用Event Agregator还是其他什么?我真的希望事件泡沫适合我的情况.
javascript design-patterns event-driven-design eventaggregator backbone.js
我正在使用熟悉的事件采购模式构建服务:
就我而言,第5步分为两部分.事件将写入事件日志.后台进程从事件日志中读取并发布从偏移量开始的所有事件.
在某些情况下,除了与聚合相关的事件之外,我还需要发布副作用.就系统而言,这些也是事件,因为它们被其他服务消耗并影响其他服务的状态.但是,它们不会影响此服务中聚合的历史记录,也不需要重建它.
我该如何在代码中处理这些?
选项1-不要将副作用事件写入事件日志.在步骤5之前的主要过程中发布这些内容.
选项2-将所有内容写入事件日志,并在加载历史记录时忽略副作用事件.(这些不是历史的一部分!)
选项3-将副作用事件写入虚拟聚合,以便发布它们,但从不加载.
选项4-?
在第一个选项中,如果存在并发冲突,则可能会出现问题.如果在步骤5中写入失败,则副作用不能轻易回滚.第二个选项写入不属于聚合历史记录的事件.在步骤2中加载时,必须忽略这些副作用事件.第三种选择感觉就像一个黑客.
哪一项似乎对你好?
场景:
我们正在ZeroMQ(特别jeroMq)评估事件驱动机制.
应用程序分布在多个服务(发布者和订阅者都是服务)可以存在于同一个jvm或不同节点中,这取决于部署体系结构.
意见
为了玩游戏我使用jero mq 创建了一个pub/ subpattern inproc:作为传输(版本:0.3.5)
题
使用inproc:连同pub/sub可行吗?
尝试谷歌搜索,但找不到任何具体的,任何见解?
pub/ subwith的代码示例inproc:
使用jero mq(版本:0.3.5)的inproc pub sub的工作代码示例对以后访问此帖子的人有用.一个出版商出版的话题A和B,和两个用户接收A并B分别
/**
* @param args
*/
public static void main(String[] args) {
// The single ZMQ instance
final Context context = ZMQ.context(1);
ExecutorService executorService = Executors.newFixedThreadPool(3);
//Publisher
executorService.execute(new Runnable() {
@Override
public void run() { …Run Code Online (Sandbox Code Playgroud) 我正在阅读这篇文章,称为事件驱动架构中的变体,它们演示了中介和代理拓扑.
根据文章,中介拓扑看起来有点像这样:
事件流开始于客户端将事件发送到事件队列,该事件队列用于将事件传输到介体.该事件介体接收初始事件,并通过发送附加异步事件编排该事件的事件通道以执行该过程的每个步骤.监听事件通道的事件处理器从偶数调解器接收事件并执行特定的业务逻辑来处理事件[...]重要的是要注意事件调解器实际上并不执行必要的业务逻辑处理初始事件,而不是它知道处理事件所需的步骤[...]事件通道可以是消息队列o消息主题.
所以,我正在研究这个图,试图理解中介如何确定给定处理器何时完成处理给定事件,以便它可以协调下一步的过程.
它说的文章不够清楚
对于每个初始事件步骤,事件中介器创建处理事件,发送该处理事件并等待相应事件处理器处理处理事件.此过程将继续,直到处理完初始事件中的所有步骤.
现在,文章清楚地表明通信是异步的,并且事件消息将通过消息队列传播,但该图不显示从事件处理器发出并返回到调解器的任何事件.
文章说调解员等待事件处理器完成,但目前尚不清楚这应该如何在架构方面发生.
它是异步的,基于队列的RPC(例如Rabbit RPC),还是有另一个侦听器在某处等待异步响应?
有关如何从架构的角度实现这一点的任何想法?
events event-driven-design event-driven orchestration microservices
编辑 v1:我一直在浏览一些系统设计视频,并了解使用消息队列和事件驱动架构的微服务架构。
但我似乎没有发现两者之间有任何实质性的区别。这两个具有不同的部件/服务发布或订阅到eventBus / messagingQueues并执行与公布的事件相关的任务。
带有消息队列的微服务架构是事件驱动架构的一个子集,还是我需要弄清楚的更多内容。
原文V0:我一直在浏览一些系统设计视频,了解微服务架构和事件驱动架构。
但我似乎没有发现两者之间有任何实质性的区别。这两个具有不同的部件/服务发布或订阅到eventBus / messagingQueues并执行与公布的事件相关的任务。
微服务架构是事件驱动架构的一个子集,还是我需要弄清楚的更多内容。
让我们假设一个简化的场景是这样的:
Kafka有两个主题,用户和订单,三个微服务 user-service,order-service和shipping-service。
通过订单服务下订单时,会将OrderCreated事件添加到订单主题,并由货运服务监听。该服务需要获取用户信息才能发送订单。根据我的要求,我无法对用户服务进行REST调用,而是使用有状态方法。也就是说,运输服务是一个Kafka Streams应用程序,该应用程序侦听用户主题,并具有由本地商店支持的KTable以及完整的用户表信息。因此,在处理订单时,它已经具有本地可用的用户信息。
但是,此方法的一个问题是运输服务中本地用户信息的一致性,例如:
用户在用户服务中更新其收货地址,它更新其本地SQL数据库,并通过此更改在用户主题中发布事件。
用户下订单,因此订单服务将其发布在订单主题中。
无论出于何种原因,运输服务都可以在从用户主题读取UserUpdated信息之前处理订单主题中的OrderCreated事件,因此它将使用不再有效的地址。
在这种事件承载状态转移方案中,我如何保证运输服务始终具有更新的用户信息?
event-driven-design event-driven apache-kafka apache-kafka-streams
想象一个事件源系统,其中存在订阅某个事件 A 的消费服务。一旦该消费者检测到事件 A 已在网络中发出,它就会以某种方式处理它并调度自己的事件 B。
有人会如何重玩这样的系统。在重播之前,事件 A 和事件 B 都存在于事件存储/数据库中。如果我们重播事件 A 和事件 B,这是否会重复计算事件 B 的调度(一旦从 A 推导出来,另一个从我们的事件存储中重播)?当一个事件可能导致其他已调度事件的级联链时,通常如何重播事件。
domain-driven-design event-driven-design cqrs event-sourcing
events ×3
java ×3
event-driven ×2
apache-kafka ×1
backbone.js ×1
c ×1
cqrs ×1
invokelater ×1
javascript ×1
jeromq ×1
worker ×1
zeromq ×1