2017-02-23 15 views
0

我正在使用Oracle Weblogic Server,如何处理mdb onMessage()中的异常。有一个例外,那么消息将保留在队列与否,因为消息不被处理&是有可能得到该消息后如果Onmessage()方法中存在异常,它是否将保留队列中的messgae并在以后再次调用MDB

这里是我的代码:

import javax.ejb.MessageDriven; 
import javax.ejb.MessageDrivenBean; 
import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.MessageListener; 
import javax.jms.TextMessage; 

import java.util.logging.Logger; 

import javax.ejb.ActivationConfigProperty; 

@MessageDriven(
activationConfig = { 
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") , 
@ActivationConfigProperty(propertyName="connectionFactoryJndiName",propertyValue="TestQCF"), 
@ActivationConfigProperty(propertyName="destinationJndiName", propertyValue="testQ") 
} 
,mappedName="testQ" 
) 

public class MyMDB implements MessageListener{ 
public void onMessage(Message message){ 

    TextMessage textMessage = (TextMessage) message; 
    try { 
     System.out.println("Received message is :"+ textMessage.getText()); 

    } 
    catch (JMSException e){ 
     e.printStackTrace(); 
    } 
} 
} 

回答

0

您需要定义如果您需要在失败时重试,则为错误目标。这个你可以在你的XML文件中定义,您已经定义了JMS队列,连接工厂等

下面是引用:
http://docs.oracle.com/middleware/1213/wls/WLACH/pagehelp/JMSjmsdestinationsjmsqueueredeliverytitle.html
https://docs.oracle.com/cd/E13222_01/wls/docs81/ConsoleHelp/domain_jmsqueue_config_redelivery.html

+0

我没有使用任何xml文件。只是在weblogic上部署了war文件 – user7352962

+0

Xml只是JMS的配置,甚至可以在您添加了其他配置的JMS代码中添加配置。 –

0

如果有异常则消息会保留在队列中或没有,因为消息未被处理&是否有可能以后得到消息

这取决于为MDB指定的事务属性。 MDB由容器调用,并且当transaction_type设置为CONTAINER时,只能指定两个事务类型 - REQUIRED或NOT_SUPPORTED,默认为后者。

当事务类型设置为REQUIRED时,异常会导致事务回滚,并且回滚MDB Container Managed事务时,容器会重新传递消息。

您也可以显式回滚异常事务。

public void onMessage(Message m){ 
    try{ 
      if(m.getJMSRedelivered()){ 
      //do whatever for redelivery cases 
      } 
    //do other stuff 
    }catch(Exception e){ 
      //log 
      msgContext.setRollbackOnly(); 
     } 
} 

我经常回去这个资源http://www.javaworld.com/article/2074123/java-web-development/transaction-and-redelivery-in-jms.html了解邮件重新传递和交易。它于2002年发布,但对我来说,它是解释JMS事务和重新交付的最佳写法。

+0

我是否需要在我的catch块中手动添加setRollback()? – user7352962

+0

编号请记住,MDB无法加入事务,因此您只需从MDB中抛出一个异常以回滚事务。 – ramp

+0

任何链接的访问都很高 – user7352962

相关问题