簡體   English   中英

在JMS和EJB中正確使用事務

[英]Correct usage of transactions in JMS and EJB

我想知道如何在EJB容器內正確使用JMS事務。 我找到了以下代碼,該代碼在無狀態Bean中使用JMS發送消息:

@Stateless
public class SendEventsBean {

  private static final Logger log = Logger.getLogger(SendEventsBean.class);

  @Resource(mappedName = "jms/MyConnectionFactory")
  private ConnectionFactory jmsConnectionFactory;

  @Resource(mappedName = "jms/myApp/MyQueue")
  private Queue queue;

  public void sendEvent() {
    Connection jmsConnection = null;
    try {
        connection = jmsConnectionFactory.createConnection();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageProducer producer = session.createProducer(queue);
        MyObj obj = new MyObj(1, "Foo");
        ObjectMessage myObjMsg = session.createObjectMessage(obj);
        producer.send(myObjMsg);
    } catch (JMSException jmxEx) {
        log.error("Couldn't send JMS message: ", jmsEx);
    }finally{
        if (jmsConnection != null) {
            try {
                jmsConnection.close();
            }catch(JMSException ex) {
               log.warn("Couldn't close JMSConnection: ", ex);
            }
        }
    }
  }

(來自何時應關閉在無狀態會話Bean中創建的JMS連接?

默認情況下,事務是使用事務屬性“必需”進行容器管理的。 假設客戶端直接調用sendEvent(),則事務從sendEvent()的開始處開始,並在sendEvent()的結尾處結束(->在該方法的末尾執行一次提交)。 在方法的最后進行提交之前關閉連接(jmsConnection.close())是否不是錯誤的?

此外,我想知道如何在createSession()上設置事務屬性和設置true / false。

如果容器已經存在一個事務(使用容器管理的事務),那么設置createSession(true,...)是否有意義? 這是否僅在JTA事務內為JMS消息創建了一個新事務(對於DB也沒有)?

通過createSession(false,...)我是對的,但是由於容器啟動了事務,因此消息是事務性的嗎?

在方法的最后進行提交之前關閉連接(jmsConnection.close())是否不是錯誤的?

否。關閉連接與JTA事務中的提交無關(在這種情況下,這是帶有CMT的ejb)。 這只是適當且必要的清理。 請注意,這些是容器返回的連接,基礎事務管理器知道如何使用資源來提交事務。 JDBC連接也是如此。

如果容器已經存在一個事務(使用容器管理的事務),那么設置createSession(true,...)是否有意義?

對於Weblogic,您絕對應該使用非事務處理會話。 但是,對於XMS連接使用XA連接工廠很重要。

http://docs.oracle.com/cd/E11035_01/wls100/jms/trans.html#wp1031645 http://www.informit.com/articles/article.aspx?p=26137&seqNum=8

但是,與JBOSS相關的文章建議即使在CMT ejb中也將createSession(true ...)設置為一種好習慣

https://developer.jboss.org/thread/213629?tstart=0&_sscc=t http://www.coderanch.com/t/606786/EJB-JEE/java/EJB-CMT-sending-JMS-message

無論設置如何,都必須強制使用基於JCA / XA的連接工廠。

通過createSession(false,...)我是對的,但是由於容器啟動了事務,因此消息是事務性的嗎?

否。如上所述,您將必須使用XA連接工廠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM