从消息驱动 bean (MDB) 内通过 HTTP 调用慢速服务

问题描述 投票:0回答:2

我有一个消息驱动的 Bean,它通过以下方式提供消息:

  1. 它从传入消息中获取数据。
  2. 使用步骤 1 中的数据通过 HTTP 调用外部服务(字面意思是使用 HttpURLConnection 发送 GET 请求)。无论调用需要多长时间 - 消息都不能被丢弃。
  3. 使用步骤 2 的结果来保存数据(使用实体 bean)。

传入消息的比率为: 一、大部分时间低:一天一个个/几十个量级。 二.有时很高:几分钟内数百个。

问题: 步骤 (2) 中的服务相对较慢(每个请求 20 秒,并且随着工作负载的增加而降级),处理情况 II 的最佳方法是什么?

我尝试过的:

  1. 让MDB等待直到服务执行,无论需要多长时间。这往往会因超时而回滚 MDB 事务并重新传递消息,从而增加工作量并使事情变得更糟。
  2. 为 HttpURLConnection 设置超时可以在 MDB onMessage() 方法的完成时间方面提供一些保证,但留下一个悬而未决的问题:如何处理“超时”消息。
http timeout ejb message-driven-bean
2个回答
0
投票

在这种情况下,您只需增加消息驱动 Bean 的事务超时即可。


0
投票

这就是我最终得到的结果(主要是应用程序服务器配置):

  1. HTTP 调用的超时时间相对较短(与事务超时相比)。这 理由:根据我的经验,长期运行的交易往往会 具有不利的副作用,例如从应用程序“挂起”的线程。 服务器角度,还是额外注意数据库配置, 等等
    我选择80秒作为超时值。
  2. 失败的重新传送间隔增加至几分钟 消息。
  3. 仔细调整处理消息的线程数量 同时地。我平衡了这个值与 HTTP 服务的吞吐量。
© www.soinside.com 2019 - 2024. All rights reserved.