BitBucket 分支创建和删除事件多次触发

BitBucket branch create and delete events fired multiple times

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

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

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

有没有一种好的方法可以在不跟踪已处理的内容的情况下处理这两个有问题的事件?我的要求是捕获 created/deleted 分支的名称和相对 URL。

为了解决这个问题,我将 @Component 注释保留在 class 级别,如下所示,并在 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>

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

希望对您有所帮助。

我是 Bitbucket Server 开发人员之一。目前尚不清楚您是如何从发布的代码片段中注册事件监听器的。还不清楚您的附加组件是如何打包的,这也很重要。

如果您有一个组件(无论是使用 @Componentspring-scanner 创建的还是使用 atlassian-plugin.xml 中的 <component/> 标记创建的,您应该 从不 需要显式引用 EventPublisher.registerunregister。 Bitbucket Server 包含一个帮助程序,可以检测 @EventListener 注释作为附加组件 created/destroyed 并且 自动 处理它们的 registration/unregistration。这意味着如果您使用 EventPublisher 手动注册您的侦听器实例,它会被注册两次,并接收每个事件两次。

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

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