2011-10-03 32 views
2

我有一个消息驱动bean,它以下列方式提供消息: 1.它从传入消息获取数据。 2.使用来自步骤1的数据通过HTTP调用外部服务(字面上,使用HttpURLConnection发送GET请求)。无论调用需要多长时间 - 消息都不能被删除。 3.使用步骤2的结果来坚持数据(使用实体bean)。通过HTTP从消息驱动Bean(MDB)中调用减缓服务

收到消息的比率是: I.大部分时间低:一个单位/一天的数量为几十个。 二,有时很高:在几分钟内成百上千。

问题: 在步骤(2)中执行该服务相对较慢(每次请求20秒并在工作负载增加时会降级),处理情况II的最佳方式是什么?

我试过了什么: 1.让MDB等到服务执行完毕,无论需要多长时间。这往往会通过超时回滚MDB事务并重新传递消息,从而增加工作量并使事情变得更糟。 2. HttpURLConnection的设置超时为MDB onMessage()方法的完成时间提供了一些保证,但留下了一个悬而未决的问题:如何处理“超时”消息。

任何想法都非常感谢。 谢谢!

回答

0

这是我结束了(主要是,这是应用程序服务器配置):

  1. 相对较短(比较事务超时)超时HTTP调用。 基本原理:根据我的经验,长时间运行的交易倾向于 有不利的副作用,例如从应用程序“挂起”的线程。 服务器的角度来看,还是额外关注数据库配置, 等
    我选择了80秒作为超时值。
  2. 失败的 消息增加了几分钟的重新传递间隔。
  3. 仔细调整同时处理消息 的线程数。我将此值与HTTP服务的吞吐量进行了平衡。
0

在这种情况下,您可以增加消息驱动bean的事务超时。