获取可能需要数小时才能显示在 table 中的所需结果集值
get the desired resultset value which could take hours to show up in the table
我的一个springbootclass中的方法processFebMessage
将从Apache ActiveMQ MOM的test
队列中获取的消息发送到sendMessage
方法,这样我就可以从 emp.data_request
table 检索 REQUEST_STATUS
列的值,如以下代码行中 RequestDaoImpl
class 的方法所示:System.out.println(rs.getString("REQUEST_STATUS"));
有关 REQUEST_STATUS
的信息很少:
这一栏主要显示一些已经开始存储的运行状态procedure.The不同的REQUEST_STATUS
值为RUNNING
、COMPLETE
、ERRONEOUS
现在发生了什么:
我的 springboot 应用程序在 Apache tomcat 上部署为 WAR。所以,现在它继续从队列和这一行System.out.println(rs.getString("REQUEST_STATUS"));
中抓取消息
在代码中为每条消息打印 RUNNING
。在数据库 table 中,一段时间后(可能是几分钟或几小时)它变为 COMPLETE
到那时我的应用程序已经
已经向前移动并处理了队列中的所有消息。
我想知道从 table 不断检查状态直到它变为 COMPLETE
的最佳方法是什么?基本上,简单来说,我想继续打电话
这行代码 rs.getString("REQUEST_STATUS")
直到我看到 COMPLETE
。在此之后,我想对 4 个不同的 table 执行一些 SELECT 操作以
获取 select 数据并将其转换为 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内部的方法实现class:
@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 分钟,这没有多大意义。
根据马特的回复跟进问题:
- 我现在根据以下标准 (using exact same criteria mentioned in the documentation) 发送 10 条消息:
了解我的消费应用程序将调用 REQUEST_STATUS
。
你在status != COMPLETED or ERRONEOUS
的时候提到了you register a new scheduled message to run again in x time.
我的问题是,producer在这段时间内已经发送或者正在发送10条消息。是不是像consumer会自动的,一个接一个的消费掉Queue中的所有消息?这是我观察到的。让我感到困惑的是当你说 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
,循环。你指的是这个吗?
使用预定消息。
像这样编写流程代码:
- 向 queue 发送消息并计划在 x 时间段 运行 一 (1) 次
- 您的消费应用收到消息以调用 REQUEST_STATUS
- 在您的方法中,如果状态 != COMPLETED 或 ERRONEOUS,您将在 x 时间后再次向 运行 注册一条新的预定消息。
- 一旦状态为 COMPLETED,您就不会注册预定的消息
- 注意:您应该在消息中添加一个 header 提供一个计数器来检查最大次数,以防止在进程出现问题时无限循环,而该进程永远不会中断 'RUNNING'状态。
我的一个springbootclass中的方法processFebMessage
将从Apache ActiveMQ MOM的test
队列中获取的消息发送到sendMessage
方法,这样我就可以从 emp.data_request
table 检索 REQUEST_STATUS
列的值,如以下代码行中 RequestDaoImpl
class 的方法所示:System.out.println(rs.getString("REQUEST_STATUS"));
有关 REQUEST_STATUS
的信息很少:
这一栏主要显示一些已经开始存储的运行状态procedure.The不同的REQUEST_STATUS
值为RUNNING
、COMPLETE
、ERRONEOUS
现在发生了什么:
我的 springboot 应用程序在 Apache tomcat 上部署为 WAR。所以,现在它继续从队列和这一行System.out.println(rs.getString("REQUEST_STATUS"));
中抓取消息
在代码中为每条消息打印 RUNNING
。在数据库 table 中,一段时间后(可能是几分钟或几小时)它变为 COMPLETE
到那时我的应用程序已经
已经向前移动并处理了队列中的所有消息。
我想知道从 table 不断检查状态直到它变为 COMPLETE
的最佳方法是什么?基本上,简单来说,我想继续打电话
这行代码 rs.getString("REQUEST_STATUS")
直到我看到 COMPLETE
。在此之后,我想对 4 个不同的 table 执行一些 SELECT 操作以
获取 select 数据并将其转换为 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内部的方法实现class:
@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 分钟,这没有多大意义。
根据马特的回复跟进问题:
- 我现在根据以下标准 (using exact same criteria mentioned in the documentation) 发送 10 条消息:
了解我的消费应用程序将调用
REQUEST_STATUS
。你在
status != COMPLETED or ERRONEOUS
的时候提到了you register a new scheduled message to run again in x time.
我的问题是,producer在这段时间内已经发送或者正在发送10条消息。是不是像consumer会自动的,一个接一个的消费掉Queue中的所有消息?这是我观察到的。让我感到困惑的是当你说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
,循环。你指的是这个吗?
使用预定消息。
像这样编写流程代码:
- 向 queue 发送消息并计划在 x 时间段 运行 一 (1) 次
- 您的消费应用收到消息以调用 REQUEST_STATUS
- 在您的方法中,如果状态 != COMPLETED 或 ERRONEOUS,您将在 x 时间后再次向 运行 注册一条新的预定消息。
- 一旦状态为 COMPLETED,您就不会注册预定的消息
- 注意:您应该在消息中添加一个 header 提供一个计数器来检查最大次数,以防止在进程出现问题时无限循环,而该进程永远不会中断 'RUNNING'状态。