Срок действия JMS после его получения не работает

Название может сбивать с толку, но это то, чего я хочу добиться. Я хочу отправить сообщение jms с 1 ejb на другой, у 2-го ejb есть прослушиватель сообщений, и теперь он работает правильно. Но я хотел, чтобы 1-й ejb создал временную очередь назначения, в которой будет отвечать 2-й ejb — это тоже работает правильно.

Моя проблема во втором ejb, он вызывает стороннюю веб-службу, которая в некоторых случаях будет отвечать через долгое время, и временная очередь должна истечь в это время. Но проблема в том, что это не соответствует java.net: http://java.net/projects/mq/lists/users/archive/2011-07/message/22

The message hasn't been delivered to a client and it expires -- in this case, the message is deleted when TTL is up.
The message is delivered to the JMS client (it's in-flight). Once this happens, since control is handed to the jms client, the broker cannot expire the message.
Finally, the jms client will check TTL just before it gives the message to the user application. If it's expired, we will not give it to the application and it will send a control message back to the broker indicating that the message was expired and not delivered.

Итак, письмо получено, но ответа пока нет. Затем в то время, когда он будет писать во временную очередь, срок его действия уже должен быть истек, но по какой-то причине я все еще мог писать в очередь, и у меня есть ff в моем журнале imq:

1 messages not expired from destination jmsXXXQueue [Queue] because they have been delivered to client at time of the last expiration reaping

Есть ли другая реализация, в которой я могу определить, истек ли срок действия временной очереди? Чтобы я мог выполнить еще один набор действий? Потому что моя проблема сейчас в том, что ejb2 поздно отвечает, и больше нет jms-ридера от ejb1, потому что он уже ушел.


person czetsuya    schedule 27.07.2012    source источник


Ответы (1)


Теперь это работает, мое решение состояло в том, чтобы обернуть 1-й bean-компонент без сохранения состояния (тот, где возникает первое сообщение jms) внутри транзакции, управляемой bean-компонентом. См. код ниже:

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
@LocalBean
public class MyBean {
    public void startProcess() {
        Destination replyQueue = send(jmsUtil, actionDTO);
        responseDTO = readReply(jmsUtil, replyQueue, actionDTO);
        jmsUtil.dispose();
    }

    public Destination send(JmsSessionUtil jmsUtil, SalesOrderActionDTO soDTO) {
        try {
            utx.begin();
            jmsUtil.send(soDTO, null, 0L, 1,
                    Long.parseLong(configBean.getProperty("jms.payrequest.timetolive")), true);
            utx.commit();
            return jmsUtil.getReplyQueue();
        } catch (Exception e) {
            try {
                utx.rollback();
            } catch (Exception e1) {

            }
        }
        return null;
    }

    public ResponseDTO readReply(JmsSessionUtil jmsUtil, Destination replyQueue,
                SalesOrderActionDTO actionDTO) {
            ResponseDTO responseDTO = null;
        try {
            utx.begin();

            responseDTO = (ResponseDTO) jmsUtil.read(replyQueue);

            if (responseDTO != null) {
                //do some action
            } else { // timeout
                ((TemporaryQueue) replyQueue).delete();
                jmsUtil.dispose();
            }
            utx.commit();
            return responseDTO;
        } catch (Exception e) {
            try {
                utx.rollback();
            } catch (Exception e1) {
            }
        }
        return responseDTO;
    }
}
person czetsuya    schedule 07.01.2013