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

Java 多次触发的BitBucket分支创建和删除事件,java,events,bitbucket,branch,bitbucket-server,Java,Events,Bitbucket,Branch,Bitbucket Server,我正在开发一个BitBucket附加组件,用于通知用户存储库和分支事件。在测试分支事件时,我注意到delete和create事件被触发了不止一次(我没有听BranchChangedEvent)。据我所知,事件也是为继承的类触发的,并由下面所示的两个方法处理 @EventListener public void onBranchCreatedEvent(BranchDeletedEvent event) { //do something } @EventListener public v

我正在开发一个BitBucket附加组件,用于通知用户存储库和分支事件。在测试分支事件时,我注意到delete和create事件被触发了不止一次(我没有听BranchChangedEvent)。据我所知,事件也是为继承的类触发的,并由下面所示的两个方法处理

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

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

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

为了解决这个问题,我在类级别保留了@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>

别忘了从bitbucket maven插件下的pom.xml中删除Atlassian插件密钥标记


希望这有帮助。

我是Bitbucket服务器开发人员之一。不清楚您是如何从发布的代码片段注册事件侦听器的。您的附加组件是如何打包的也不清楚,这一点也很重要

如果您有一个组件(无论是使用
@component
spring scanner
创建的,还是使用
atlassian plugin.xml
中的
标记创建的),您都不需要显式引用
EventPublisher.register
unregister
。Bitbucket服务器包括一个帮助程序,它在创建/销毁附加组件时检测
@EventListener
注释,并自动处理它们的注册/注销。这意味着,如果使用
EventPublisher
手动注册侦听器实例,它将注册两次,并接收两次每个事件

不过,另一种可能性是,您实际上最终注册了两个侦听器实例。您通常可以在调试器中轻松地“看到”这一点,方法是在
@EventListener
方法中放置一个断点,并在每次命中断点时查看
System.identityHashCode(this)
(其中
this
是您的侦听器实例)。如果您从
identityHashCode
获得多个结果,则表示您有多个实例。(如果您没有在侦听器上重写
toString()
,您还应该能够使用它来确定您是否有多个实例,因为默认实现将标识hashcode作为十六进制字符包含。)我已经帮助其他插件开发人员解决了他们有多个侦听器实例的问题;比如,。这条线索可能对你也有用


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

您不知道正在处理的Bitbucket服务器的版本,这使得帮助变得更加困难。不过,你不需要这样做。通过从pom.xml中删除“Atlassian Plugin Key”,您将从预转换的插件切换到已转换的插件。这意味着您的@Component注释被忽略,创建侦听器的唯一原因是您在atlassian-plugin.xml中添加了。