From 7a9bbd21f018981ce132dd7d2d4ab1ca33bd4df2 Mon Sep 17 00:00:00 2001 From: cremet Date: Thu, 28 Aug 2003 09:18:10 +0000 Subject: - Made the auction example work (it required to... - Made the auction example work (it required to fix the mailbox implementation). --- sources/examples/auction.scala | 111 +++++++++++++++++++++++++++++++++-------- 1 file changed, 91 insertions(+), 20 deletions(-) (limited to 'sources/examples/auction.scala') diff --git a/sources/examples/auction.scala b/sources/examples/auction.scala index 102892b4c6..8e32831942 100644 --- a/sources/examples/auction.scala +++ b/sources/examples/auction.scala @@ -5,54 +5,125 @@ import scala.concurrent._; trait AuctionMessage; case class - Offer(bid: Int, client: Actor), // make a bid + Offer(bid: int, client: Actor), // make a bid Inquire(client: Actor) extends AuctionMessage; // inquire status trait AuctionReply; case class - Status(asked: Int, expiration: Date), // asked sum, expiration date - BestOffer, // yours is the best offer - BeatenOffer(maxBid: Int), // offer beaten by maxBid + Status(asked: int, expiration: Date), // asked sum, expiration date + BestOffer(), // yours is the best offer + BeatenOffer(maxBid: int), // offer beaten by maxBid AuctionConcluded(seller: Actor, client: Actor), // auction concluded - AuctionFailed, // failed with no bids - AuctionOver extends AuctionReply; // bidding is closed + AuctionFailed(), // failed with no bids + AuctionOver() extends AuctionReply; // bidding is closed -class Auction(seller: Actor, minBid: Int, closing: Date) extends Actor { +class Auction(seller: Actor, minBid: int, closing: Date) extends Actor { - val timeToShutdown = 36000000; // msec + val timeToShutdown = 3600000; // msec val bidIncrement = 10; + override def run() = { var maxBid = minBid - bidIncrement; - var maxBidder: Actor = _; + var maxBidder: Actor = null; var running = true; + while (running) { - receiveWithin ((closing.getTime() - new Date().getTime())) { + receiveWithin (closing.getTime() - new Date().getTime()) { + case Offer(bid, client) => if (bid >= maxBid + bidIncrement) { - if (maxBid >= minBid) maxBidder send BeatenOffer(bid); + if (maxBid >= minBid) + maxBidder send BeatenOffer(bid); maxBid = bid; maxBidder = client; - client send BestOffer; + client send BestOffer() } else { - client send BeatenOffer(maxBid); - } + client send BeatenOffer(maxBid) + } case Inquire(client) => - client send Status(maxBid, closing); + client send Status(maxBid, closing) - case TIMEOUT => + case TIMEOUT() => if (maxBid >= minBid) { val reply = AuctionConcluded(seller, maxBidder); maxBidder send reply; - seller send reply; + seller send reply } else { - seller send AuctionFailed; + seller send AuctionFailed() } receiveWithin(timeToShutdown) { - case Offer(_, client) => client send AuctionOver - case TIMEOUT => running = false; + case Offer(_, client) => client send AuctionOver() + case TIMEOUT() => running = false } + } } } } + +////////////////////////// TEST ///////////////////////////////// + +object testAuction { + + val random = new java.util.Random(); + + val minBid = 100; + val closing = new Date(new Date().getTime() + 60000); + + val seller = new Actor { + override def run() = {} + } + val auction = new Auction(seller, minBid, closing); + + def client(i: int, increment: int, top: int) = new Actor { + val name = "Client " + i; + def log(msg: String) = System.out.println(name + ": " + msg); + var running = true; + var max: int = _; + var current: int = 0; + override def run() = { + log("started"); + auction send Inquire(this); + receive { + case Status(maxBid, _) => { + log("status(" + maxBid + ")"); + max = maxBid + } + } + while (running) { + if (max >= top) + log("too high for me") + else if (current < max) { + current = max + increment; + Thread.sleep(1 + random.nextInt(1000)); + auction send Offer(current, this); + } + receive { + case BestOffer() => { + log("bestOffer(" + current + ")"); + } + case BeatenOffer(maxBid) => { + log("beatenOffer(" + maxBid + ")"); + max = maxBid; + } + case AuctionConcluded(seller, maxBidder) => { + log("auctionConcluded"); + } + case AuctionOver() => { + running = false; + log("auctionOver"); + } + } + } + } + } + + def main(args: Array[String]) = { + seller.start(); + auction.start(); + client(1, 20, 200).start(); + client(2, 10, 300).start(); + } + +} -- cgit v1.2.3