我可以控制Java监听器的刷新率吗?

时间:2014-06-19 18:04:03

标签: java listener

我几天前就在努力解决这个问题,但我无法找到解决方案。 我有一个收听市场数据的听众(买入和卖出订单)。如果市场平静(上市前或上市后(低波动性))一切正常。但是一旦市场开放,听众就会收到太快的事件。所以几分钟后我的应用程序冻结了。 现在,侦听器仅将接收到的数据分配给var。

orderBookBid.getBuyOrders().addListener(new ObservableListModelListener<Order>() {
        @Override
        public void modelChanged(final Change<? extends Order> change) {
                System.out.println("bid event");
                   bidChange = change.getSource();
            }
    });

程序仅在使用真实数据时冻结。当市场关闭并使用本地文件中的测试数据时,工作正常。

有没有办法设置每秒最大事件数?或者在短时间内忽略事件的任何方式? 关于如何处理这个问题的任何想法都将非常感激。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以在应用程序中放置一个负载均衡器,这样就会创建一个队列并且不会冻结该应用程序。

如果你想放弃一些事件,在听众的逻辑中,你应该有一些东西来检查自你上次管理事件以来它是否是X时间。

private long timeSinceLastEventManaged = 0;
private final static long MINIMUM_TIME = 2000; //2 seconds

在你的听众中

public void modelChanged(final Change<? extends Order> change) {
    long timeSystem = System.currentTimeMillis();
    if(timeSystem - timeSinceLastEventManaged > MINIMUM_TIME){
        //do your stuff
        timeSinceLastEventManaged  = timeSystem;
    }
}

答案 1 :(得分:0)

首先,你应该摆脱println,因为它确实是slow

其余取决于你在做什么。现在看起来你只是获得了价值并将其写入变量。您只会看到最新的更改方式,如果这是您想要的解决方案@TyMarc建议将正常工作。

如果你向我们展示的只是一个例子而你真的需要每一次改变,事情会变得复杂一些。应更改modelChanged方法,将当前值添加到队列中(例如LinkedListStack)。

public void modelChanged(final Change<? extends Order> change) 
        {
            syncronized(syncObject)
            {
               //add to your preffered queue
               syncObject.notifyAll()
            }
        }

这使您的听众从实际工作中解脱出来,并且可以继续收集数据。

我添加了syncronized,因为有人必须做这项工作。为此,您可以使用运行类似的Thread

Order current;
while(keeprunning)
{
   syncronized(syncObject)
   {
      if(queue.hasNext())
      {
        current = queue.getNext()
      }
      else
      {
        Thread.wait()
      }
   }

   //do the real work here
}

现在别人有问题了。从字面上看。如果Thread无法处理数据流入,则队列的大小会增大,直到内存不足或达到其他限制为止。但这是另一个故事。

是的,没有任何内容可以编译,因为我只想展示一个例子