我几天前就在努力解决这个问题,但我无法找到解决方案。 我有一个收听市场数据的听众(买入和卖出订单)。如果市场平静(上市前或上市后(低波动性))一切正常。但是一旦市场开放,听众就会收到太快的事件。所以几分钟后我的应用程序冻结了。 现在,侦听器仅将接收到的数据分配给var。
orderBookBid.getBuyOrders().addListener(new ObservableListModelListener<Order>() {
@Override
public void modelChanged(final Change<? extends Order> change) {
System.out.println("bid event");
bidChange = change.getSource();
}
});
程序仅在使用真实数据时冻结。当市场关闭并使用本地文件中的测试数据时,工作正常。
有没有办法设置每秒最大事件数?或者在短时间内忽略事件的任何方式? 关于如何处理这个问题的任何想法都将非常感激。
感谢。
答案 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
方法,将当前值添加到队列中(例如LinkedList或Stack)。
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
无法处理数据流入,则队列的大小会增大,直到内存不足或达到其他限制为止。但这是另一个故事。
是的,没有任何内容可以编译,因为我只想展示一个例子