2012-10-30 89 views
3

在將JBoss 5應用程序遷移到JBoss AS 7(7.1.1.FINAL)時,我遇到了一個新的JMS消息驅動EJB的問題。在消息處理中,必須檢查一些主數據字段。爲了提高性能,應使用一個需要大約30秒來加載數據的EJB將這個主數據預加載到緩存結構中。暫停MDB消息處理,直到@StartupBean完成初始化

我的問題是即使緩存尚未完全初始化,隊列消息處理也會啓動,從而導致消息驗證錯誤。

我試圖定義MDB和啓動EJB之間的依賴關係,但據我瞭解,@DependsOn註釋僅適用於@Singleton EJB。所以很顯然,我的解決方案不起作用;-)

啓動Bean代碼:

@Singleton 
@Startup 
public class StartupBean { 

    @PostConstruct 
    void atStartup() { 
     // TODO load master data cache (takes about 30 seconds) 
    } 

    @PreDestroy() 
    void atShutdown() { 
     // TODO free master data cache 
    } 
} 

注:我扯下了真正的代碼示例中,使其更易於閱讀:-)

消息驅動bean代碼:

@MessageDriven(name="SampleMessagingBean", activationConfig = { 
     @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"), 
     @ActivationConfigProperty(propertyName="destination", propertyValue="jms/SampleQueue"), 
     @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") 
    }) 
    @DependsOn("StartupBean") 
    public class SampleMessagingBean implements MessageListener { 

    public void onMessage(Message message) { 
     // TODO validate message using master data cache 
    } 
} 

問:我怎麼能夠終止消息處理,直到啓動Bean已經完成loadin g緩存?

任何建議非常感謝:-)!

回答

3

首先,我認爲在mdb中注入singleton EJB足以延遲消息消耗 但是,有時它會在Singleton-ejb的@PostConstruct完成之前開始消費消息。因此,增加了一個方法調用也和它開始工作

這個工作在GlassFish,但我沒有看到一個原因,它不應該在JBoss工作

辛格爾頓的EJB:

@Singleton 
@Startup 
public class SingletonBean { 
    private Logger logger = Logger.getLogger(getClass().getName()); 

    private boolean init = false; 

    public boolean isInit() { 
     return init; 
    } 

    @PostConstruct 
    public void init() { 
     logger.error("singleton init start"); 

     //Do something that takes time here 

     init = true; 
     logger.error("singleton init end "); 
    } 
}  

和mdb:

@MessageDriven(...) 
public class SomeMdb implements MessageListener { 
    private Logger logger = Logger.getLogger(getClass().getName()); 

    @EJB 
    SingletonBean sb; 

    @PostConstruct 
    public void init() { 
     logger.error("mdb init start"); 
     if (!sb.isInit()) { 
      logger.error("never happens"); 
     } 
     logger.error("mdb init complete"); 
    } 

    public void onMessage(Message message) { 
     logger.error("onMessage start"); 
    } 
}  

現在,它總是等待SingletonBean完成初始化MDB完成初始化之前(如日誌所示)

19:51:51,980 [ad-pool-1; w: 3] ERROR SomeMdb  - mdb init start 
19:51:52,122 [ad-pool-4848(4)] ERROR SingletonBean - singleton init start 
19:51:56,316 [ad-pool-4848(4)] ERROR SingletonBean - singleton init end 
19:51:56,317 [ad-pool-1; w: 3] ERROR SomeMdb  - mdb init complete 
19:51:56,317 [ad-pool-1; w: 3] ERROR SomeMdb  - onMessage start 
+0

在JBoss上也很棒,謝謝Aksel :-)! – skowski

+0

嗯......不幸的是在WildFly 8.2上不起作用 –

相關問題