0
データベーステーブルまたはフラットファイルから4000万行(データ行)をフェッチしています。私は行ごとに1人のワーカーを作成することで、Groovy の評価用に各行を処理しています(この場合、私は4000万人のワーカーを作成しています)。 ここでは、AKKAのラウンドロビンプールを使用しています。このアプローチは正しいですか?そうでない場合は、それを行う最善の方法です。Akkaラウンドロビンプール
public class AkkaWay {
public static void main(String[] args) {
System.out.println("************************** start *****************************");
new AkkaWay().run();
System.out.println("************************** END *****************************");
}
private void run() {
ActorSystem system = ActorSystem.create("CalcSystem");
ActorRef master = system.actorOf(Master.createMaster(), "master");
master.tell(new Calculate(), ActorRef.noSender());
while(!master.isTerminated()){
try{
//System.out.println("*********************************** Thread *************************************************");
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public class Master extends UntypedActor
{
private final Time time = new Time();
public Master() {
workerRouter = this.getContext().actorOf(Worker.createWorker().withRouter(new RoundRobinRouter(4)),"workerRouter");
}
@Override
public void onReceive(Object message) {
if (message instanceof Calculate) {
time.start();
processMessages();
} else if (message instanceof Result) {
list.add(((Result) message).getFactorial());
if (list.size() == messages)
end();
} else {
unhandled(message);
}
}
private void processMessages()
{
//read data from file/database (40 millions rows)
for (int i = 0; i < rows; i++) {
workerRouter.tell(new Work(), getSelf());// each row send
}
}
private void end() {
time.end();
System.out.println("Done: " + time.elapsedTimeMilliseconds()+"["+time.elapsedTimeMilliseconds()/1000+" secs]");
getContext().system().shutdown();
}
public static Props createMaster() {
return Props.create(Master.class, new ArraySeq<Object>(0));
}
}
public class Worker extends UntypedActor
{
@Override
public void onReceive(Object message) {
if (message instanceof Work) {
//evaluate Groovy expression
getSender().tell(new Result(bigInt), getSelf());
} else
unhandled(message);
}
public static Props createWorker() {
return Props.create(Worker.class, new ArraySeq<Object>(0));
}
}
codereviewがこの質問に適しているようですね。 – Quickbeam2k1