我可以控制Java侦听器的刷新率吗?
从几天前开始,我就一直在努力解决这个问题,但我无法找到解决方案。 我有一个监听器接收市场数据(买卖订单)。如果市场平静(市场前或市场后(低波动))一切正常。但一旦市场开放,听众接收事件的速度就太快了。因此,几分钟后,我的应用程序冻结。 现在,侦听器只将接收到的数据分配给一个var我可以控制Java侦听器的刷新率吗?,java,listener,Java,Listener,从几天前开始,我就一直在努力解决这个问题,但我无法找到解决方案。 我有一个监听器接收市场数据(买卖订单)。如果市场平静(市场前或市场后(低波动))一切正常。但一旦市场开放,听众接收事件的速度就太快了。因此,几分钟后,我的应用程序冻结。 现在,侦听器只将接收到的数据分配给一个var orderBookBid.getBuyOrders().addListener(new ObservableListModelListener<Order>() { @Override
orderBookBid.getBuyOrders().addListener(new ObservableListModelListener<Order>() {
@Override
public void modelChanged(final Change<? extends Order> change) {
System.out.println("bid event");
bidChange = change.getSource();
}
});
orderBookBid.getBuyOrders().addListener(新的ObservableListModelListener(){
@凌驾
public void modelChanged(final Change您可以在应用程序中放置负载平衡器,这样它将创建一个队列,而不会冻结应用程序
如果你想让一些事件过去,在你的监听器的逻辑中,你应该有一些东西来检查自从你上次管理事件以来是否已经过了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;
}
}
public void modelChanged(最终更改首先,您应该去掉println
,因为它实际上是
剩下的取决于你正在做什么。现在看来你只是在获取值并将其写入一个变量。你只能通过这种方式看到最新的更改,如果这是你想要的,那么@TyMarc建议的解决方案就可以了
如果您向我们展示的只是一个示例,并且您确实需要每次更改,那么事情会变得更加复杂。您的modelChanged
方法应该更改,以便将当前值添加到队列中(例如或)
现在其他人也有问题了。从字面上说。如果线程无法处理数据流入,队列的大小将不断增加,直到内存耗尽或达到其他限制。但这是另一回事
是的,这一切都不会编译,因为我只想展示一个示例您在生产代码中没有使用println??在应用程序和LoadBalancing源之间放置一个消息队列我只需要最后一个值。订单是一个快照,有最好的60到100个出价订单(在getSellOrders侦听器中的ask)。如果没有新订单,则会一次又一次发送相同的快照。println不在生产代码中。同步解决方案是我已经尝试过的,但没有成功。我将尝试@TyMarc的解决方案,但2秒太多了,我将尝试200或300秒。现在市场关闭,我无法检查它。现在一切正常。TY@fpi如果我的答案对你有用,尼禄可以随意接受。其他人可能也会觉得它有用。我接受了@TyMarc answer。如果你需要处理更少的事件,它可以解决问题。这就是我所问的。但问题似乎与ObservableListModelListener有关。在侦听器中什么都不做,程序就会冻结。我已经联系了w和API供应商一起,他们正在调查这个问题。同时我在想,如果连接、断开侦听器可以帮助我保持应用程序的活力。
public void modelChanged(final Change<? extends Order> change)
{
syncronized(syncObject)
{
//add to your preffered queue
syncObject.notifyAll()
}
}
Order current;
while(keeprunning)
{
syncronized(syncObject)
{
if(queue.hasNext())
{
current = queue.getNext()
}
else
{
Thread.wait()
}
}
//do the real work here
}