【问题标题】:BitBucket branch create and delete events fired multiple timesBitBucket 分支创建和删除事件多次触发
【发布时间】:2017-05-26 18:58:57
【问题描述】:

我正在开发一个通知用户存储库和分支事件的 BitBucket 插件。在测试分支事件时,我注意到删除和创建事件被多次触发(我没有在听 BranchChangedEvent)。据我了解,事件也会为继承的类触发,并由下面显示的两种方法处理。

@EventListener
public void onBranchCreatedEvent(BranchDeletedEvent event) {
    //do something
}

@EventListener
public void onBranchCreatedEvent(BranchCreatedEvent event) {
    //do something
}

有没有一种很好的方法来处理有问题的两个事件而不跟踪已经处理的事件?我的要求是捕获创建/删除分支的名称和相对 URL。

【问题讨论】:

    标签: java events bitbucket branch bitbucket-server


    【解决方案1】:

    为了解决这个问题,我在类级别保留@Component 注解,如下所示,并在 atlassian-plugin.xml 文件中添加了组件注册。

    @Component
    public class MyEventListener implements DisposableBean { 
    
        ... ctor with injected EventPublisher eventPublisher
    
        @EventListener
        public void onBranchCreatedEvent(BranchDeletedEvent event) {
            //do something
        }
    
        @EventListener
        public void onBranchCreatedEvent(BranchCreatedEvent event) {
            //do something
        }
    
        public void destroy() throws Exception {
             eventPublisher.unregister(this);
        }
    }
    

    atlassian-plugin.xml

     <component key="bitbucket-activity-listener" class="my.package.name.MyEventListener">
     </component>
    

    不要忘记从你的 pom.xml 中的 bitbucket-maven-plugin 下删除 Atlassian-Plugin-Key 标签。

    希望这会有所帮助。

    【讨论】:

    • 您不知道您正在处理的是哪个版本的 Bitbucket 服务器,这使得提供帮助变得更加困难。不过,您应该不需要这样做。通过从 pom.xml 中删除“Atlassian-Plugin-Key”,您正在从预先转换的插件切换到转换后的插件。这意味着您的@Component 注释被忽略,而创建侦听器的唯一原因是因为您在 atlassian-plugin.xml 中添加了
    【解决方案2】:

    我是 Bitbucket Server 开发人员之一。目前尚不清楚您如何从发布的 sn-p 注册事件侦听器。您的插件是如何打包的也不清楚,这也很重要。

    如果您有一个组件(无论是使用@Componentspring-scanner 创建还是使用atlassian-plugin.xml 中的&lt;component/&gt; 标签创建),您应该永远需要显式引用EventPublisher.registerunregister。 Bitbucket Server 包含一个帮助程序,可检测 @EventListener 注释作为附加组件正在创建/销毁,并自动处理它们的注册/注销。这意味着如果您使用 EventPublisher 手动注册您的侦听器实例,它会注册两次,并接收每个事件两次。

    不过,另一种可能性是,您实际上最终会注册您的侦听器的 2 个实例。您通常可以通过在 @EventListener 方法中放置一个断点并在每次遇到断点时查看 System.identityHashCode(this)(其中 this 是您的侦听器实例)来轻松地在调试器中“看到”这一点。如果您从identityHashCode 获得多个结果,则意味着您有多个实例。 (如果您没有在侦听器上覆盖toString(),您还应该能够使用它来确定您是否有多个实例,因为默认实现包括身份哈希码作为十六进制字符。)我帮助了其他附加组件开发人员解决了他们有多个监听器实例的问题;例如,stash2slack add-on。该线程可能对您也有用。

    如果您想分享有关您的插件的更多详细信息,我很乐意帮助您进行进一步调查。

    【讨论】:

      猜你喜欢
      • 2014-09-18
      • 2013-02-15
      • 2018-06-12
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      相关资源
      最近更新 更多