JMS и Spring партия
Наш проект состоит в том, чтобы объединить два приложения, используя rest api каждого из них, используя JMS(для обеспечения асинхронного характера) и подпружиненный пакет, чтобы считывать объемные данные из очереди JMS и обрабатывать их, а затем публиковать в принимающем приложении.
Я новичок как в JMS, так и в весенней партии. У меня есть несколько основных вопросов:
- Какая модель JMS должна быть впереди (PTP или Pub / Sub)
- Можно ли массово читать сообщения из очереди JMS(используя JMSItemReader). Если да, может кто-нибудь, пожалуйста, предоставьте код.
- Мы хотим подтверждать сообщения как "прочитанные", как только они успешно отправлены (т. Е. Чтение-процесс-запись) в принимающее приложение, а не тогда, когда оно читается JMSItemReader. Как мы можем достичь этого?
1 ответ
PTP против Pub/sub
Метод точка-точка, использующий очередь сообщений, является наиболее стандартным методом. Особенно в пакетном приложении я не вижу непосредственной причины использовать подписку на публикацию, которая предполагает, что у вас есть несколько потребителей одних и тех же сообщений.
Теоретически, если необходимо выполнить несколько функций на одних и тех же порциях данных, вы можете организовать различные процессоры в качестве подписчиков таким образом, масштабируя приложение, но это довольно сложный сценарий использования.
Можно ли массово читать сообщения из очереди JMS:
Спецификация JMS здесь только говорит (смутно, может быть, неправильно читает) о массовом подтверждении сообщений, но она не устанавливает требования к массовой доставке сообщений.
CLIENT_ACKNOWLEDGE - с помощью этой опции клиент подтверждает сообщение, вызывая метод подтверждения сообщения. Подтверждение использованного сообщения автоматически подтверждает получение всех сообщений, которые были доставлены его сеансом.
Проще говоря, ответ относительно массовой доставки: "Если JMS-провайдер поддерживает это, то да, иначе нет"
Большинство провайдеров допускают массовое подтверждение сообщений
Вот что делает интерфейс Oracles:
public interface com.sun.messaging.jms.Message {
void acknowledgeThisMessage() throws JMSException;
void acknowledgeUpThroughThisMessage() throws JMSException;
}
Сочетание CLIENT_ACKNOWLEDGE . + вызывая метод cknowledgeUpThroughThisMessage на. сообщение подтвердит все сообщения, полученные до этого момента времени.
Ручное подтверждение сообщений:
Это может быть достигнуто через CLIENT_ACKNOWLEDGE и метод подтверждения в сообщении. Здесь я снова процитирую вам javadoc метода подтверждения, который также ссылается еще раз на ваш второй вопрос и говорит о массовом подтверждении всех сообщений до определенного момента.
void Подтверждение () создает исключение JMSException Подтверждает все использованные сообщения сеанса этого использованного сообщения. Все использованные сообщения JMS поддерживают метод подтверждения для использования, когда клиент указал, что использованные сообщения его сеанса JMS должны быть явно подтверждены. Вызывая подтверждение для использованного сообщения, клиент подтверждает все сообщения, использованные сеансом, в который было доставлено сообщение.
Вызовы подтверждения игнорируются как для транзакционных сеансов, так и для сеансов, указанных для использования режимов неявного подтверждения.
Клиент может индивидуально подтверждать каждое сообщение по мере его использования, или он может выбрать подтверждение сообщений как группы, определенной приложением (что делается путем вызова подтверждения для последнего принятого сообщения группы, тем самым подтверждая все сообщения, использованные сеансом.)
Сообщения, которые были получены, но не подтверждены, могут быть доставлены.