我正在开发一个BitBucket插件,用于通知存储库和分支事件的用户。在测试分支事件时,我注意到多次触发delete和create事件(我没有收听BranchChangedEvent)。根据我的理解,事件也会为继承的类触发,并由下面显示的两个方法处理。
@EventListener
public void onBranchCreatedEvent(BranchDeletedEvent event) {
//do something
}
@EventListener
public void onBranchCreatedEvent(BranchCreatedEvent event) {
//do something
}
有没有一种很好的方法可以处理这两个事件,而无需跟踪已处理的内容?我的要求是捕获创建/删除分支的名称和相对URL。
答案 0 :(得分:0)
为了解决这个问题,我在类级保留了@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-plugin下的pom.xml中删除Atlassian-Plugin-Key标记。
希望这有帮助。
答案 1 :(得分:0)
我是Bitbucket Server开发人员之一。您不清楚如何从您发布的代码段中注册您的事件监听器。它还不清楚您的插件是如何打包的,这一点也很重要。
如果您有一个组件(无论是使用@Component
和spring-scanner
创建的,还是使用<component/>
中的atlassian-plugin.xml
标记创建的),您应该从不需要明确引用EventPublisher.register
或unregister
。 Bitbucket Server包含一个帮助程序,可以检测@EventListener
注释,因为正在创建/销毁附加组件,并且自动处理其注册/取消注册。这意味着如果您使用EventPublisher
手动注册您的侦听器实例,它将被注册两次,并且每次接收两次事件。
另一种可能性是,您实际上最终会注册您的侦听器的 2个实例。你通常可以看到&#34;这很容易在调试器中通过在@EventListener
方法中放置断点并在每次遇到断点时查看System.identityHashCode(this)
(其中this
是您的侦听器实例)。如果您从identityHashCode
获得多个结果,则表示您有多个实例。 (如果你没有在你的监听器上覆盖toString()
,你也应该能够使用它来确定你是否有多个实例,因为默认实现包括身份hashcode为十六进制字符。)I&#39; ve帮助其他附加开发人员解决他们有多个听众实例的问题;例如,stash2slack add-on。那个帖子也可能对你有用。
如果您想分享有关附加组件的其他详细信息,我们很乐意帮助进一步调查。