Я внедряю решение JMS MDB для вызова веб-сервисов, которые будут запускаться из нескольких точек приложения.Ради проверки моего решения я просто передаю Integer
объекты прямо сейчас.Я заставляю код пересылать сообщения, когда Integer
больше 5
.Однако, если сообщение было доставлено дважды, его следует игнорировать / подтверждать.Время ожидания, настроенное в Websphere, составляет 5 минут, а максимальное число неудачных доставок на сообщение - 0 (в разделе Назначение исключений на шинах -> {шина} -> Пункты назначения -> {пункт назначения).
Проблема заключается в том, чтосообщение для объекта 6
отправляется обратно в очередь для повторной доставки через 5 минут, сообщения на 7, 8, 9 ... также удерживаются до тех пор, пока 6
не будет доставлено.Хотя я знаю, что JMS не гарантирует порядок доставки сообщений, но обычно это FIFO.Но как только сообщение отправлено обратно в очередь и доставлено, порядок оставшихся сообщений не является последовательным.то есть это что-то вроде 6, 8, 9, 7. Согласно спецификациям активации JMS Максимальный размер пакета равен 1, а Максимальное число одновременных вызовов MDB для конечной точки равно 10.
Любая идея, как обращаться с новыми сообщениями, которые заблокированы из-засообщение на удержании?Я передал вопрос по этой ссылке, он говорит, что очередь не должна быть заблокирована.
JMS и MDB с setRollbackOnly
Также, пожалуйста, предоставьте предложения по поддержанию порядка сообщений.
Фрагмент кода:
public void onMessage(javax.jms.Message msg) {
try {
if (msg instanceof ObjectMessage) {
ObjectMessage objMsg = (ObjectMessage)msg;
Object obj = objMsg.getObject();
UserTransaction userTxn = getMessageDrivenContext().getUserTransaction();
userTxn.begin();
InitialContext initialContext = new InitialContext();
ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("jms/cf");
javax.jms.Connection conn = cf.createConnection();
Session jmsSession = conn.createSession(true, -1);
Queue queue = (Queue) initialContext.lookup("jms/queue1");
QueueBrowser queueBrowser = jmsSession.createBrowser(queue);
Enumeration enumeration = queueBrowser.getEnumeration();
while (enumeration.hasMoreElements()) {
System.out.println("Browse [" + enumeration.nextElement() + "]");
}
if ((Integer)obj >= 6) {
int count = Integer.valueOf(msg.getStringProperty("JMSXDeliveryCount"));
if (count > 2) {
System.out.println("********** max rollback");
userTxn.commit();
} else {
System.out.println("********** rollback");
userTxn.setRollbackOnly();
}
} else {
System.out.println("********** commit");
userTxn.commit();
}
} else {
}
} catch (Exception ex) {
ex.printStackTrace();
throw new EJBException("Transaction failed: " + ex.getMessage());
} catch (Throwable t) {
}
}