2017-05-26 36 views
0

我正在研究一個BitBucket插件,通知存儲庫和分支事件的用戶。在測試分支事件時,我注意到刪除和創建事件被多次觸發(我沒有聽取BranchChangedEvent)。根據我的理解,這些事件也是爲繼承類而開發的,並且由以下兩種方法處理。BitBucket分支創建和刪除事件多次觸發

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

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

有沒有一種很好的方法來處理這兩個事件,而沒有跟蹤已經處理了什麼?我的要求是捕獲創建/刪除分支的名稱和相對URL。

回答

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> 

不要忘記從你的pom.xml下到位桶,Maven的插件刪除Atlassian的-插件密鑰標籤。

希望這會有所幫助。

+0

你並不不知道你正在處理的是什麼版本的Bitbucket服務器,這使得它很難提供幫助。 雖然你不需要這樣做。通過從pom.xml中刪除「Atlassian-Plugin-Key」,您可以從預先轉換的插件切換到已轉換的插件。這意味着您的@Component註釋是_ignored_,並且創建偵聽器的唯一原因是您添加到atlassian-plugin.xml中的。 –

0

我是Bitbucket服務器開發人員之一。目前尚不清楚您如何從您發佈的代碼段中註冊您的事件監聽器。目前還不清楚你的加載項如何打包,這也很重要。

如果你有分量(atlassian-plugin.xml使用@Componentspring-scanner是否創建或使用<component/>標籤創建),你應該永遠需要明確引用EventPublisher.registerunregister。 Bitbucket服務器包含一個幫助程序,可在創建/銷燬附件組件時自動檢測@EventListener註釋,會自動處理的註冊/註銷。這意味着如果您使用EventPublisher來手動註冊偵聽器實例,它將被註冊兩次,並接收每個事件兩次。

不過,另一種可能性是,您實際上以結尾,您的聽衆正在註冊2個實例。在調試器中,您通常可以通過在每次觸發斷點時在@EventListener方法中放置一個斷點並查看System.identityHashCode(this)(其中this是您的偵聽器實例)來輕鬆「看到」這一點。如果您從identityHashCode獲得多個結果,則表示您有多個實例。 (如果您的監聽器沒有重寫toString(),那麼您應該也可以使用它來確定您是否有多個實例,因爲默認實現將身份哈希碼包含爲十六進制字符。)我幫助其他附加開發人員修復他們有多個聽衆實例的問題;例如,stash2slack add-on。那個線程也許對你有用。

如果您想分享一些關於您的加載項的其他詳細信息,我很樂意幫助進一步調查。