获得所需的结果集值,该值可能需要数小时才能显示在表格中

Posted

技术标签:

【中文标题】获得所需的结果集值,该值可能需要数小时才能显示在表格中【英文标题】:get the desired resultset value which could take hours to show up in the table 【发布时间】:2019-02-24 03:08:56 【问题描述】:

我的一个springboot类中的processFebMessage方法将从Apache ActiveMQ MOM的test队列中获得的消息发送到sendMessage方法,以便我可以从@987654328检索REQUEST_STATUS列的值@table 如下代码行中RequestDaoImpl类的方法所示:System.out.println(rs.getString("REQUEST_STATUS"));

关于REQUEST_STATUS的小信息:

这一栏主要展示了一些已经启动的存储过程的运行状态。不同的REQUEST_STATUS值是RUNNINGCOMPLETEERRONEOUS

现在发生了什么:

我的 springboot 应用程序在 Apache tomcat 上部署为 WAR。所以,现在它继续从队列中抓取消息,这条线System.out.println(rs.getString("REQUEST_STATUS")); 在代码中为每条消息打印RUNNING。在数据库表中,一段时间后(可能是几分钟或几小时)它会更改为 COMPLETE 到那时我的应用程序有 已经向前移动并处理了队列中的所有消息。

我想知道什么是最好的方法来一次又一次地检查表格中的状态,直到它变为COMPLETE?基本上,简单来说,我想继续打电话 这行代码rs.getString("REQUEST_STATUS") 直到我看到COMPLETE。在此之后,我想对 4 个不同的表执行一些 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 类中的方法实现:

@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 分钟,它不会使很有意义。

根据 Matt 的回复跟进问题:

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

    了解我的消费应用将调用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。你指的是这个吗?

【问题讨论】:

睡觉不是个好主意。尝试让邮件稍后重新发送,以便您重试。 我明白了。实际上,消息是用户驱动的。我的意思是,在我的发布者 spring-boot 应用程序中,当 Ajax 调用命中 REST 控制器时,会调用一个存储过程,并且该存储过程会生成一条新的唯一消息,该消息将发送到 ActiveMQ。任何想法,在这种情况下我应该如何处理?不确定在这种情况下如何重新发送消息。 我不使用 ActiveMQ,所以我必须凭直觉(并在他们的网站上进行一些清理),但作为消息的消费者,您可以触发重新传递(延迟由重新投递政策),因此您可以稍后再试。 好的。所以看起来即使消息已被消费者消费并且不存在于队列中,ActiveMQ 还是有可能再次重新传递消息。 【参考方案1】:

使用预定消息。

像这样对流程进行编码:

    将消息发送到队列并安排在 x 时间段内运行一 (1) 次 您的消费应用收到消息以调用 REQUEST_STATUS 在您的方法中,如果状态 != COMPLETED 或 ERRONEOUS,您注册一个新的计划消息以在 x 时间再次运行。 一旦状态为 COMPLETED,您就不会注册预定消息 注意:您应该在消息中添加一个标头,提供一个用于检查最大次数的计数器,以防止在永不脱离“RUNNING”状态的进程出现问题时出现无限循环。

ActiveMQ Scheduled Message

【讨论】:

谢谢。因此,我将基于发布者的 springboot 应用程序单独部署。如果应用程序发送用户驱动的预定消息,并且如果 status != COMPLETED or ERRONEOUS 在消费者端,那么我的消费者(不同的 springboot 应用程序)可以重新注册消息以运行 x-time 吗?我想知道在这种情况下它是否需要以某种方式与发布者通信? 不,不需要协调。像这样异步和解耦是一种非常好的模式。在您的情况下,注册一次性预定消息 - 没有重复,没有 cron。 嘿@Matt Pavlowich,快速问题:我能够接收带有计时器的消息,基本上有一个初始延迟,重复发送 10 次,每次重新发送之间等待 10 秒,如文档activemq.apache.org/delay-and-schedule-message-delivery.html。如果我想在第 5 条消息处停止(如果我的状态在第 5 条消息处为 COMPLETED),您能否告诉我如何停止从消费者端的队列接收消息?我在文档中找不到任何与配置相关的详细信息。再次感谢。 已编辑答案以澄清......这是否清楚?注册一条消息以传递 1 次.. 每次检查并且状态未完成时.. 注册一条新的预定消息。一旦状态ok,就不需要注册消息了。 我明白你在说什么,但想澄清更多。我用这些问题更新了我的帖子。请看一下。谢谢你的时间。赞赏。

以上是关于获得所需的结果集值,该值可能需要数小时才能显示在表格中的主要内容,如果未能解决你的问题,请参考以下文章

无法从反应光滑中获得所需的结果

如何通过比较数字来获得所需的功能?

为啥我总是必须将精灵的位置更改为其他位置才能获得所需的位置

在javascript中创建对象数组以获得所需的结果[关闭]

触发重大位置变化更新和给定位置准确性所需的行进距离

如何获得woocommerce免费送货的最低订单金额