共享监视器对象

时间:2014-07-14 08:04:48

标签: java multithreading concurrency

美好时光!

有一个很大的Web应用程序,有很多线程来回处理数据。其中一部分是处理交易的服务(TradeProcessingService)。当收到交易时,它将被验证并发送给其他服务进一步处理。因此,TradeProcessingService是此Web应用程序组件的入口点。

每笔交易只与一个交易所相关联。只要所有处理都基于交易所,就需要并行进行这种处理以进行不同的交易。

与上述功能一起,有一个调度服务(ExchangeDataUpdaterService),它每10秒更新一次交换数据。只要该数据用于交易处理,就需要同步处理和更新操作。

因此,不仅要求同步每个处理线程(使用所有服务的方法调用链) 交换,但也将这些线程与更新线程同步(也可以通过交换数据)。

我对这些任务没有经验。似乎应该有一些共享的监视器对象(比如每个交换一个)用于处理和更新线程......

请您提出一些处理上述情况的最佳做法吗?

1 个答案:

答案 0 :(得分:0)

首先,感谢OldCurmudgeon,Martin James和Peter Lawrey建议的解决方案。 我将描述我实现的方法(只是没有任何灾难恢复或资源释放机制的概述)。

正如我之前所写,主要思想是为每个交易所进行并行处理。

首先,我创建了一个以交换为键和ExchangeTaskProcessorEnv类作为值的映射,其中一个ExchangeTaskProcessorEnv类对象包含一个BlockingQueue(用于ExchangeAwareTask类对象)和一个ExchangeAwareTaskProcessor类对象(它是一个Runnable实现,从队列中调用每个ExchangeAwareTask类对象的“invoke”方法并执行一些额外的处理)。描述的映射位于单例类--ExchangeTaskHolder中。

其次,可以针对不同的业务案例执行许多操作:更新交易所的信息,更新交易信息,与FTP服务器同步数据......对于这些操作中的每一个我创建了一个扩展ExchangeAwareTask类的任务,并覆盖了'invoke'方法(每个任务都知道必须如何处理它)。值得一提的是,每个任务都包含对相应交换的引用。

第三,我介绍了一个静态工厂,以便能够为所需的交换创建所需的任务。

最后,当用户或调度机制需要执行某些操作时,它会在工厂中创建一个必需的任务,并将其添加到ExchangeTaskHolder对象中,该对象将其分配给相应的交换。

一段时间后,我意识到当某些行动与任何交换不对应或者某个行动对应所有交易所时,会有一些特殊情况。没问题,在第一种情况下可以添加额外的任务映射桶( 交换感知处理机制不受影响 ),而在第二种情况下可以添加一个特殊的ExchangeTaskHolder的方法为每个ExchangeAwareTaskProcessor创建所需的任务(对于每个交换)。

一段时间后,又出现了另一项要求:每项任务必须具有一定的权重。没问题,我刚刚用PriorityBlockingQueue改变了ExchangeTaskHolder的BlockingQueue。