获取可能需要数小时才能显示在 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值为RUNNINGCOMPLETEERRONEOUS

现在发生了什么:

我的 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 分钟,这没有多大意义。

根据马特的回复跟进问题:

  1. 我现在根据以下标准 (using exact same criteria mentioned in the documentation) 发送 10 条消息:

  1. 了解我的消费应用程序将调用 REQUEST_STATUS

  2. 你在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 时。我的意思是,如果我没记错的话,我无法在消费者中明确指定注册新的预定消息,对吗?

  3. 同样,当你说Once the status is COMPLETED, you do not register a scheduled message时,我有点困惑。我的意思是它在理论上完全有意义,但我想知道,如果在 ActiveMQ 中,如果我的状态是 COMPLETED,是否有任何特定的说明可以遵循以避免注册预定消息?但是以编程方式,我可以 break 来自一旦我看到状态为COMPLETED,循环。你指的是这个吗?

使用预定消息。

像这样编写流程代码:

  1. 向 queue 发送消息并计划在 x 时间段 运行 一 (1) 次
  2. 您的消费应用收到消息以调用 REQUEST_STATUS
  3. 在您的方法中,如果状态 != COMPLETED 或 ERRONEOUS,您将在 x 时间后再次向 运行 注册一条新的预定消息。
  4. 一旦状态为 COMPLETED,您就不会注册预定的消息
  5. 注意:您应该在消息中添加一个 header 提供一个计数器来检查最大次数,以防止在进程出现问题时无限循环,而该进程永远不会中断 'RUNNING'状态。

ActiveMQ Scheduled Message