Something went wrong on our end
-
Brutzman, Don authoredBrutzman, Don authored
SimpleServer.java 5.70 KiB
package SimkitOpenDis7Examples;
import simkit.Priority;
import simkit.SimEntityBase;
import simkit.random.RandomVariate;
/**
* Simple Server component. Instances of this class cannot be used on their own,
* but require another SimEntity to schedule Arrival events. If it is desired to
* listen to an event of another name,use an Adapter instance.
*
* The StartService is schedule with a positive priority, which will ensure it
* will occur ahead of any simultaneously scheduled Arrival events, as long as
* they have the default priority of 0.0.
*
* @author abuss@nps.edu
*/
public class SimpleServer extends SimEntityBase {
/**
* Total number of servers
*/
private int totalNumberServers;
/**
* Generates service times
*/
private RandomVariate serviceTimeGenerator;
/**
* number of available servers at any time
*/
protected int numberAvailableServers;
/**
* number in queue at any time
*/
protected int numberInQueue;
/**
* Number customers served
*/
protected int numberServed;
/**
* Zero-argument constructor
*/
public SimpleServer() {
}
/**
* Creates a new instance of SimpleServer with the given parameters
*
* @param totalNumberServers Total number of servers
* @param serviceTimeGenerator Service time generator. Must be RandomVariate
* instance that only generates non-negative values.
*/
public SimpleServer(int totalNumberServers, RandomVariate serviceTimeGenerator) {
setTotalNumberServers(totalNumberServers);
setServiceTimeGenerator(serviceTimeGenerator);
}
/**
* Set numberAvailable servers to total number servers, numberInQueue to 0,
* numberServed to 0.
*/
@Override
public void reset() {
super.reset();
numberInQueue = 0;
numberAvailableServers = totalNumberServers;
numberServed = 0;
}
/**
* Just fires PropertyChange events
*/
public void doRun() {
firePropertyChange("numberInQueue", getNumberInQueue());
firePropertyChange("numberAvailableServers", getNumberAvailableServers());
firePropertyChange("numberServed", getNumberServed());
}
/**
* Increment number in queue. If a server is available, schedule
* StartService immediately with priority of 1.0
*/
public void doArrival() {
int oldNumberInQueue = numberInQueue;
numberInQueue = numberInQueue + 1;
firePropertyChange("numberInQueue", oldNumberInQueue, getNumberInQueue());
if (getNumberAvailableServers() > 0) {
waitDelay("StartService", 0.0, Priority.HIGH);
}
}
/**
* Decrement numberInQueue and numberAvailableServers Schedule EndService
* after service time delay
*/
public void doStartService() {
int oldNumberInQueue = numberInQueue;
numberInQueue = numberInQueue - 1;
firePropertyChange("numberInQueue", oldNumberInQueue, numberInQueue);
int oldNumberAvailableServers = numberAvailableServers;
numberAvailableServers = numberAvailableServers - 1;
firePropertyChange("numberAvailableServers", oldNumberAvailableServers, numberAvailableServers);
// double serviceTime = getServiceTimeGenerator().generate();
// firePropertyChange("serviceTime", serviceTime);
waitDelay("EndService", serviceTimeGenerator);
}
/**
* Increment numberAvailableServers If customers in queue, schedule
* StartService immediately with HIGH priority
*/
public void doEndService() {
int oldNumberAvailableServers = numberAvailableServers;
numberAvailableServers = numberAvailableServers + 1;
firePropertyChange("numberAvailableServers", oldNumberAvailableServers, numberAvailableServers);
int oldNumberServed = numberServed;
numberServed = numberServed + 1;
firePropertyChange("numberServed", oldNumberServed, numberServed);
if (getNumberInQueue() > 0) {
waitDelay("StartService", 0.0, Priority.HIGH);
}
}
/**
* accessor method to get a state variable
* @return the numberAvailableServers
*/
public int getNumberAvailableServers() {
return numberAvailableServers;
}
/**
* accessor method to get a state variable
* @return the numberInQueue
*/
public int getNumberInQueue() {
return numberInQueue;
}
/**
* accessor method to set a state variable
* @param totalNumberServers total number of servers
* @throws IllegalArgumentException if totalNumberServers < 0
*/
public void setTotalNumberServers(int totalNumberServers) {
if (totalNumberServers <= 0) {
throw new IllegalArgumentException("Need positive number of servers: " + totalNumberServers);
}
this.totalNumberServers = totalNumberServers;
}
/**
* accessor method to get a state variable
* @return the serviceTimeGenerator
*/
public RandomVariate getServiceTimeGenerator() {
return this.serviceTimeGenerator;
}
/**
* accessor method to set a state variable
* @param serviceTimeGenerator the serviceTimeGenerator to set
*/
public void setServiceTimeGenerator(RandomVariate serviceTimeGenerator) {
this.serviceTimeGenerator = serviceTimeGenerator;
}
/**
* accessor method to get a state variable
* @return the totalNumberServers
*/
public int getTotalNumberServers() {
return this.totalNumberServers;
}
/**
* accessor method to get a state variable
* @return the numberServed
*/
public int getNumberServed() {
return this.numberServed;
}
}