2017-02-23 11 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 – user7352962

+0

Xml - это просто настройка JMS, вы можете добавить эту конфигурацию даже в свой код, где вы добавили свои другие конфигурации для JMS. –

0

Если есть исключение, то сообщение будет сохраняются в очереди или нет, поскольку сообщение не обрабатывается & можно получить сообщение позже

Это зависит от того, атрибут транзакции, указанный для MDB. MDB вызывается контейнером, и когда для параметра transaction_type установлено значение CONTAINER, могут быть указаны только два типа транзакций - REQUIRED или NOT_SUPPORTED, причем по умолчанию используется последний.

Когда тип транзакции установлен в ТРЕБУЕМЫЙ, исключение вызывает откат транзакции и когда транзакция управляемой транзакции MDB откатывается назад, контейнер повторно обновляет сообщение.

Вы также можете явно отменить транзакцию по исключениям.

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 понять сообщение Redelivery и сделок. Он был опубликован в 2002 году, но для меня это лучшая запись, которая объясняет транзакции JMS и доставку.

+0

Нужно ли добавлять setRollback() вручную в мой блок catch? – user7352962

+0

Нет. Помните, что MDB не может присоединиться к транзакции, поэтому все, что вам нужно сделать, это выбросить исключение из MDB для отката транзакции. – ramp

+0

Любые ссылки высоко оцениваются – user7352962