2014-02-14 122 views
1

如何確保我的單例消息驅動bean一次處理一條消息?如何確保單一消息驅動的bean一次處理一條消息?

@Singleton 
public class MyMdb implements MessageListener { 
    @Override 
    public void onMessage(final Message message) { 
     ... 
    } 
} 

製作onMessage方法的同步不起作用,因爲這會導致這個錯誤:

weblogic.ejb.container.compliance.ComplianceException: In EJB MyMdb, Enterprise Bean methods must not use thread synchronization primitives. The method named onMessage(javax.jms.Message) is synchronized.

回答

1

在Oracle WebLogic服務器,您可以使用本機序功能。請參閱http://docs.oracle.com/cd/E14571_01/web.1111/e13727/uoo.htm官方文檔以獲取更多信息。具有相同的單位順序標題的消息將強烈地處理一個接一個。

此外,您可以將custome工作管理器添加到您的EJB並將MinThreadConstraint和MaxThreadConstraint設置爲1。你的所有消息將在一個線程中處理一個接一個。

+0

任何想法如何添加自定義工作管理器嗎? – Jay

+0

只需在weblogic-ejb-jar.xml文件中將以下行 CalculatorWorkManager添加到您的EJB描述(在wls:weblogic-enterprise-bean元素內) 。 – samolisov

0

我認爲單身人士的使用不符合預期。
我相信@Singleton是指非MDBs。
實際上,僅僅實施MessageListener是不足以製作MDB的。
您也必須將您的類註釋爲@MessageDriven。

您可能會嘗試製作MDB(http://docs.oracle.com/javaee/6/tutorial/doc/bnbpo.html),然後創建第二個EJB(而不是MDB)作爲一個真正的單身人士,而不是嘗試製作單身MDB。
您可以使用單例的併發註釋來控制對其的訪問。
然後將新單例的一個「實例」(真正的代理)注入到MDB中,並讓MDB通過單例完成所有處理。

Here is info on that