获得所需的结果集值,该值可能需要数小时才能显示在表格中
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
值是RUNNING
、COMPLETE
、ERRONEOUS
现在发生了什么:
我的 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,就不需要注册消息了。
我明白你在说什么,但想澄清更多。我用这些问题更新了我的帖子。请看一下。谢谢你的时间。赞赏。以上是关于获得所需的结果集值,该值可能需要数小时才能显示在表格中的主要内容,如果未能解决你的问题,请参考以下文章