只是想知道,我的任务是创建一个程序,在具有唯一数据库的多个服务器上实现两阶段提交协议。到目前为止,我已经完成了所需的一切工作 - 它适用于理论上n个服务器。但是,我希望程序在协议结束后保持打开状态,但每次都会关闭,大多数情况下会出现如下大错误:
java.nio.channels.ClosedByInterruptException
java.nio.channels.ClosedByInterruptException
at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:202)
at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:163)
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65)
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109)
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at dcs.os.Server.queryDatabase(Server.java:162)
at dcs.os.Server.lambda$processClient$1(Server.java:266)
at dcs.os.Server$$Lambda$2/200825655.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
我认为我需要放一个' while(true)'循环,但我已经尝试过它并没有起作用。任何想法如何编辑我的代码,以便可以多次查询服务器而无需重新运行程序?代码如下:
int serverListenPort = Integer.parseInt(args[1]); // The port that this server should listen on to accept connections from other servers
int clientListenPort = Integer.parseInt(args[2]); // The port that this server should listen on to accept connections from clients
InetSocketAddress[] otherServerAddresses = Server.parseAddresses(args[3]); // The addresses of the other servers
String databasePath = args[4]; // The path to the database file
MyServer server = new MyServer(databasePath);
if (args[1].endsWith("LastServer")) {
server.setTail();
args[1] = args[1].substring(0, args[1].indexOf('L'));
}
server.setServers(otherServerAddresses);
try{
server.acceptClients(clientListenPort);
int serverNo = (serverListenPort-8999) / 2;
System.out.println(serverNo);
if (serverNo == 1) {
server.setHead();
}
server.acceptServers(serverListenPort);
System.out.println("Closing server");
server.close();
} catch {...} finally {...}
已请求的其他代码:
public void acceptServers(int port) throws IOException {
if (acceptSS != null && acceptSS.isBound()) {
acceptSS.close();
}
acceptSS = new ServerSocket(port);
returnSock = acceptSS.accept();
OutputStream os = returnSock.getOutputStream();
InputStream is = returnSock.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
StockList request = request = new StockList();
int itemCount = is.read();
for (int i=0; i<itemCount; i++) {
String item = in.readLine();
int amount = Integer.decode(in.readLine()).intValue();
request.add(item, amount);
}
StockList dbStock = queryDatabase();
byte success = 0;
if (dbStock.enough(request)) {
success = 1;
}
os.write(success);
if (is.read()==1) {
System.out.println("COMMIT");
dbStock.remove(request);
writeDatabase(dbStock);
}
returnSock.close();
acceptSS.close();
}
@Override
public void connectServers(InetSocketAddress[] servers) throws IOException {
commSocks = new Socket[servers.length];
System.out.println("Connecting...");
for (int i=0; i<commSocks.length; i++) {
commSocks[i] = new Socket();
System.out.println(servers[i]);
commSocks[i].connect(servers[i]);
System.out.println("Connected.");
}
}