我正在开发一个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-plugin下的pom.xml中删除Atlassian-Plugin-Key标记。
希望这可以帮助。
我是Bitbucket Server开发人员之一。目前尚不清楚如何从您发布的代码段中注册您的事件监听器。目前还不清楚你的插件是如何打包的,这一点也很重要。
如果你有一个组件(无论是使用@Component
和spring-scanner
创建的还是使用<component/>
中的atlassian-plugin.xml
标签创建的),你都不应该明确地引用EventPublisher.register
或unregister
。 Bitbucket Server包含一个帮助程序,可以检测@EventListener
注释,因为正在创建/销毁附加组件并自动处理其注册/取消注册。这意味着如果你使用EventPublisher
手动注册你的监听器实例,它会被注册两次,并接收每个事件两次。
但是,另一种可能性是,您实际上最终会注册2个侦听器实例。通过在@EventListener
方法中放置断点并在每次遇到断点时查看System.identityHashCode(this)
(其中this
是您的侦听器实例),您通常可以在调试器中“看到”这一点。如果从identityHashCode
获得多个结果,则表示您有多个实例。 (如果你没有在你的监听器上覆盖toString()
,你也应该能够使用它来确定你是否有多个实例,因为默认实现包括身份hashcode为十六进制字符。)我已帮助其他附加开发人员修复他们有多个听众实例的问题;例如,stash2slack add-on。那个帖子也可能对你有用。
如果您想分享有关您的插件的其他详细信息,我们很乐意帮助进一步调查。