Метод processFebMessage
в одном из моих классов Springboot отправляет сообщение, полученное из очереди test
из Apache ActiveMQ MOM, в метод sendMessage
, чтобы я мог извлечь значение столбца REQUEST_STATUS
из emp.data_request
таблица, как показано в методе класса RequestDaoImpl
ниже в следующей строке кода: System.out.println(rs.getString("REQUEST_STATUS"));
Маленькая информация относительно REQUEST_STATUS
:
Этот столбецв основном показывает текущее состояние некоторых уже запущенных хранимых процедур. Различные значения REQUEST_STATUS
RUNNING
, COMPLETE
, ERRONEOUS
Что происходит сейчас:
Мое приложение Springboot развернуто как WAR на Apache tomcat.Итак, сейчас он продолжает извлекать сообщения из очереди, и эта строка System.out.println(rs.getString("REQUEST_STATUS"));
в коде печатает RUNNING
для каждого из сообщений.В таблице базы данных через некоторое время (это может быть несколько минут или, может быть, часов) оно меняется на COMPLETE
, к тому времени мое приложение уже продвинулось и обработало все сообщения из очереди.
Мне интересноКаков наилучший подход, чтобы продолжать проверять состояние из таблицы снова и снова, пока оно не изменится на COMPLETE
? В основном, простыми словами, я хочу продолжать вызывать эту строку кода rs.getString("REQUEST_STATUS")
, пока не увижу COMPLETE
.После этого я хочу выполнить некоторые операции SELECT для 4 разных таблиц, чтобы выбрать данные, преобразовать их в CSV и поместить их где-нибудь на сервере.
@JmsListener(destination = "test")
public void processFebMessage(String message) throws DaoException {
System.out.println("Message Retrieved is:" +message);
try {
RequestDao requestDao = (RequestDao) context.getBean("requestDao");
requestDao.sendMessage(message);
}
catch(Throwable th){
th.printStackTrace();
}
}
RequestDao
public interface RequestDao {
public void sendMessage(String msg) throws DaoException;
}
Реализация метода внутри класса RequestDaoImpl:
@Override
public void sendMessage(String msg) throws DaoException {
DataSource ds = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
ds = jdbcTemplate.getDataSource();
conn = ds.getConnection();
pstmt = conn.prepareStatement("select REQUEST_STATUS from emp.data_request where id=?");
pstmt.setString(1,msg);
rs = pstmt.executeQuery();
rs.next();
System.out.println("The status received is as follows:");
System.out.println(rs.getString("REQUEST_STATUS"));
}
catch(Throwable th) {
//some code
}
finally {
//some code
}
}
Дайте мне знать, если я смогу ответить на некоторые вопросы.Мне в голову как-то приходит цикл по Thread.sleep, но я читал, что это не очень хорошая практика, потому что если REQUEST_STATUS
изменится на COMPLETE
через несколько минут, и я остановлю поток на 30 минут, это не сделаетмного смысла.
Ответьте на вопросы, основанные на ответе Мэтта:
- Сейчас я отправляю 10 сообщений на основе следующих критериев (, используя точно такие же критерии, упомянутые вдокументация ):
Понял, что мое приложение-потребитель будет вызывать REQUEST_STATUS
.
Когда status != COMPLETED or ERRONEOUS
, вы упомянули you register a new scheduled message to run again in x time.
Мой вопрос, производитель уже отправил или впроцесс отправки 10 сообщений за это время.Разве это не похоже на то, что потребитель автоматически будет продолжать потреблять все сообщения из очереди по очереди?Это то, что я заметил.Меня смущает то, что вы говорите register a new scheduled message to run again in x time
.Я имею в виду, если я не ошибаюсь, у потребителя нет способа, которым я мог бы явно указать, чтобы зарегистрировать новое запланированное сообщение, верно?
Точно так же я немного растерялся, когда вы говорите Once the status is COMPLETED, you do not register a scheduled message
.Я имею в виду, что теоретически это имеет смысл, но мне интересно, есть ли в ActiveMQ какие-либо конкретные инструкции, чтобы не регистрировать запланированное сообщение, если мой статус COMPLETED
? Но программно я могу break
из цикла, как только явидеть статус как COMPLETED
.Это то, что вы имели в виду?