标签: event-dispatching

发布者 - 订阅者与观察者

我试图将Observer设计模式理解为主要事件调度设计模式.观察者模式似乎是发布 - 订阅设计模式的类型或类型,我想知道为什么有两个相似的外观设计模式以及我应该如何在两者之间进行选择.

在这两种情况下,信息消息都在实体之间发送,在这两种情况下,实体必须以某种方式注册或订阅才能接收消息.

两种设计模式之间的主要区别似乎是:

  • 观察者模式似乎具有较低的消息量.观察员向他们观察的实体注册,以获得某一事件的通知.发布 - 订阅模式似乎涉及单向对话,一种从一个实体到另一个实体的独白,具有更多不同类型的消息.
  • 在Observer模式中,Observers期望一种特定类型的事件通知,其中Publish-Subscribe似乎具有更开放的消息协议,具有更广泛的可能消息类型和消息内容(由特定类型的事件触发的消息之间的差异)指示事件发生与更一般的消息协议相对应,消息包含可能不是事件触发器的信息,例如包含由周期性定时器触发的温度数据的消息.
  • Observer在应用程序的边界内或在单个进程内实现.Publish-Subscribe是一种跨应用程序通信模式,消息在不同进程之间交换.
  • 架构的不同之处在于,当Observer使用组合的发布者/代理和订阅者(​​观察者)实体时,Publish-Subscribe具有单独的发布者,代理和订阅者实体.

我想到的一个想法是,在多线程应用程序中,可以在多个线程之间进行通信而不是Observer模式时使用Publish-Subscribe模式.也许Obse​​rver模式可以在进程之间使用,例如进程注册与另一个进程注册,以便在事件发生时得到通知.一个示例是农场管理仪表板应用程序,其注册多个动物饲料箱,如果由箱测量的饲料水平或重量下降到某个阈值以下则通知.

这两种设计模式之间是否存在其他重要差异,这些设计模式可以为选择一种模式提供标准?

design-patterns publish-subscribe event-dispatching observer-pattern

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

如何在C#中调度事件

我希望创建自己的事件并发送它们.我之前从未在C#中做过这件事,仅在Flex中.我想必须有很多不同之处.

有人能为我提供一个很好的例子吗?

c# events event-dispatching

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

如何在Swing中暂时禁用事件监听器?

我有一个带有模型和视图的Swing应用程序.在视图(GUI)中有许多组件,每个组件映射到模型对象的某些属性并显示它的值.

现在有一些UI组件在UI中的值发生更改时会自动触发某些模型属性的更新.这需要我在UI中重新加载完整的模型.这样我就进入了一个无限的更新循环,因为UI中的每个模型重新加载都会触发另一个模型重新加载.

我有一个标志指示加载过程,我想用它来暂时禁止监听器通知,同时从模型中设置UI字段.所以我的问题是:

有没有办法在Swing中全局暂时禁用某些组件的侦听器而无需删除并重新连接它们?

java events swing event-dispatching

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

HTML5拖放ondragover未在Chrome中触发

我在这里有一个简单的例子,它不是在Chrome 11中为我开火http://jsfiddle.net/G9mJw/,它包含一个非常简单的代码:

var dropzone = document.getElementById('dropzone'),
    draggable = document.getElementById('draggable');


function onDragOver(event) {
    var counter = document.getElementById('counter');
    counter.innerText = parseInt(counter.innerText, 10) + 1;
}


dropzone.addEventListener('dragover', onDragOver, false);
Run Code Online (Sandbox Code Playgroud)

它似乎在safari中工作得很好......但是在Chrome中,dragover当红色方块触摸虚线时,事件不会被调用.

我试图复制一些目前正在使用chrome的示例,但它对我来说也不起作用.

我已经尝试阻止默认行为,如果工作但看不到它.任何帮助将非常感激.

谢谢

javascript events drag-and-drop event-dispatching

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

在PHP库中集成事件调度程序的最佳方法是什么?

我需要在我自己的代码库(自定义PHP库)中集成一个事件调度程序,所以我看看Symfony2Zend Framework 2正在做什么.

显然,没有用于调度事件的共享接口,因为两个框架都有不同的需求并决定实现自己的代码......所以我有点迷失:我不想重新发明我的个人轮子.

用于实现观察者模式的SPL接口可能有点幼稚,所以我在这里问你:你会做什么?

编辑

由于目前尚不清楚......我想重新使用现有的ED,让开发人员将其注入我的库中.

假设您使用调度程序开发了一个lib,并且您知道您的lib将成为Symfony Bundle的一部分并在ZF项目中重复使用:您肯定希望重新使用Symfony和ZF调度程序,而不是您自己的.

因此,我一直在寻找在主流库中实现的现有调度程序的共享接口,但听起来似乎没有解决方案.

php zend-framework event-dispatching symfony observer-pattern

7
推荐指数
1
解决办法
1746
查看次数

为什么Symfony EventDispatcher对事件使用任意名称而不是基于类的传播?

我想在我的应用程序中实现Observer Pattern(不是php,这就是为什么不使用Symfony的组件).

虽然组件没有使用类来传播或监听事件,但我发现它很奇怪,因为这样可以使用继承来监听整个事件树.

我看不到使用基于名称的听众的单一优势,你能帮我解决一下吗?

design-patterns event-dispatching symfony observer-pattern

7
推荐指数
1
解决办法
686
查看次数

正确更新摆动组件?

我是新手,任何帮助表示感谢.

在这段代码中,我正在翻牌,如果事实证明他们不匹配,我希望他们再次面朝下.

目前正在发生的事情:1.当点击时,第一张卡翻过来2.当点击第二张卡时,发生两件事情中的任何一件(a)如果他们是相同的他们都熬夜这是我想要的(b)如果他们是不一样的我从来没有看到第二个卡,就好象它立即重新显示卡的背面(也为我的方法定义的前面卡的背面).

我认为放入睡眠计时器可能会让第二张卡显示一段时间后再转回,但事实并非如此.

我试图使用contentPane.revalidate(); &contentPane.repaint(); 但它没有改变任何东西.

我已经输入了一些控制台输出:

Console output:
Card: 0 set
Card: 6 set
Sleeping now
Card: 6 unset
Card: 0 unset
Run Code Online (Sandbox Code Playgroud)

上面是单击两张不匹配的卡时产生的控制台输出

@Override
public void actionPerformed(ActionEvent e) 
{
    String buttonPressed = e.getActionCommand();
    int pos = Integer.valueOf(buttonPressed);
    action = Control.model.ReceiveCardsTurned(pos);

    keypadArray[pos].setIcon(myIcons[pos]);     
    System.out.println("Card: "+pos+" set");
    currentTime.setText("" + Control.model.time);
    currentScore.setText("" + Control.model.score);

    //contentPane.revalidate();
    //contentPane.repaint();        

    if(Control.model.twoCardsTurned == false)
    {
        if (action == "unturn") 
        {
            System.out.println("Sleeping now");

            try 
            {
                Thread.sleep(1000);
            }

            catch (InterruptedException e1) 
            {
                e1.printStackTrace();
            }

            keypadArray[pos].setIcon(back);
            keypadArray[Control.model.lastCard].setIcon(back);
            System.out.println("Card: "+pos+" unset"); …
Run Code Online (Sandbox Code Playgroud)

java concurrency swing timer event-dispatching

6
推荐指数
2
解决办法
255
查看次数

Symfony主义事件订阅者未在debug:event-dispatcher中列出

Symfony v3.3.4,Doctrine ORM v2.5.6

我已经为一个理论实体创建了一个事件订阅者:

AppBundle\EventListener\LivreSubscriber:
    tags:
        - { name: doctrine.event_subscriber }
Run Code Online (Sandbox Code Playgroud)

它工作正常!但是很长时间以来,我都坚信它没有用,因为在debug:event-dispatcher命令中未列出侦听器:

$ docker-compose exec phpapp bin/console debug:event-dispatcher doctrine.event_subscriber

[WARNING] The event "doctrine.event_subscriber" does not have any registered listeners.
Run Code Online (Sandbox Code Playgroud)

事件监听器是相同的。而且:symfony探查器(“事件”部分)中都未列出侦听器和订户...这样可以正常工作,但是奇怪的是侦听器中没有列出侦听器,不是吗?

你能告诉我你的项目是否有同样的行为吗?

php event-dispatching symfony doctrine-orm symfony-3.3

6
推荐指数
1
解决办法
1094
查看次数

调度拖尾事件

我想以编程方式触发 d3-drag 的“结束”事件。我有一些圈子,并像这样实现了它们的拖动处理:

...
.call(d3.drag()
     .on("drag", function () {...})
     .on("end", function () {...})
)
Run Code Online (Sandbox Code Playgroud)

现在,稍后在我的代码中,我想以编程方式触发“结束”部分。

我已经尝试过这样的事情:

d3.select("#myID").dispatch("end");
d3.select("#myID").dispatch("dragend");
d3.select("#myID").call(d3.drag().dispatch("end"));
Run Code Online (Sandbox Code Playgroud)

javascript event-dispatching d3.js

6
推荐指数
1
解决办法
111
查看次数

可靠的Webhook调度系统

我很难为 Webhook 调度系统找出可靠且可扩展的解决方案。

当前系统使用RabbitMQwebhook 队列(我们称之为events),该队列被消耗和调度。该系统运行了一段时间,但现在出现了一些问题:

  • 如果系统用户产生过多的事件,会占用队列,导致其他用户长时间收不到webhook
  • 如果我将所有事件分成多个队列(通过 URL 哈希),则可以减少第一个问题的可能性,但当非常繁忙的用户访问同一队列时,它仍然会时不时地发生
  • 如果我尝试将每个 URL 放入其自己的队列中,面临的挑战是动态创建/分配消费者到这些队列。就RabbitMQ文档而言,该 API 在过滤非空队列或未分配消费者的队列方面非常有限。
  • Kafka我了解,在阅读有关它的所有内容后,情况在单个分区的范围内是相同的。

那么,问题是 - 有没有更好的方法/系统来实现此目的?也许我缺少一个非常简单的解决方案,可以让一个用户不干扰另一个用户?

提前致谢!

webhooks rabbitmq event-dispatching apache-kafka

6
推荐指数
1
解决办法
1433
查看次数