fixed concurrent modification exception of car map

This commit is contained in:
MaximZaitsev
2016-07-28 17:46:24 +03:00
parent 2b6a4aa71e
commit 4bc332c121
5 changed files with 75 additions and 15 deletions
@@ -0,0 +1,7 @@
package Exceptions
/**
* Created by user on 7/28/16.
*/
class InactiveCarException : Exception() {
}
+20 -2
View File
@@ -1,3 +1,4 @@
import Exceptions.InactiveCarException
import car.client.Client
import io.netty.bootstrap.ServerBootstrap
import io.netty.buffer.Unpooled
@@ -77,7 +78,13 @@ fun main(args: Array<String>) {
request.headers().set(HttpHeaderNames.HOST, car.host)
request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE)
request.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, request.content().readableBytes())
Client.sendRequest(request, car.host, car.port, id)
try {
Client.sendRequest(request, car.host, car.port, id)
} catch (e: InactiveCarException) {
synchronized(environment, {
environment.map.remove(id)
})
}
break
} else {
val wayPointData = wayPointInputString.split(" ")
@@ -99,13 +106,24 @@ fun main(args: Array<String>) {
}
} else if (readedString.equals("refloc", true)) {
val cars = synchronized(environment, { environment.map.values })
val inactiveCarUids = mutableListOf<Int>()
for (car in cars) {
val request = DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, getLocationUrl, Unpooled.EMPTY_BUFFER)
request.headers().set(HttpHeaderNames.HOST, car.host)
request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE)
request.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, request.content().readableBytes())
Client.sendRequest(request, car.host, car.port, car.uid)
try {
Client.sendRequest(request, car.host, car.port, car.uid)
} catch (e: InactiveCarException) {
inactiveCarUids.add(car.uid)
}
println("ref loc done")
}
synchronized(environment, {
for (id in inactiveCarUids) {
environment.map.remove(id)
}
})
} else if (readedString.equals("stop")) {
break
} else {
+2 -5
View File
@@ -1,11 +1,11 @@
package car.client
import Exceptions.InactiveCarException
import io.netty.bootstrap.Bootstrap
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.nio.NioSocketChannel
import io.netty.handler.codec.http.HttpRequest
import io.netty.util.AttributeKey
import objects.Environment
import java.net.ConnectException
/**
@@ -34,10 +34,7 @@ object Client {
} catch (e: InterruptedException) {
} catch (e: ConnectException) {
val carMap = Environment.instance.map
synchronized(carMap, {
carMap.remove(carUid)
})
throw InactiveCarException()
}
}
@@ -1,15 +1,16 @@
package car.client
import CodedInputStream
import InvalidProtocolBufferException
import LocationResponse
import getLocationUrl
import io.netty.channel.ChannelHandlerContext
import io.netty.channel.SimpleChannelInboundHandler
import io.netty.handler.codec.http.HttpContent
import io.netty.handler.codec.http.DefaultHttpContent
import io.netty.util.AttributeKey
import objects.Environment
import LocationResponse
import java.io.ByteArrayInputStream
import CodedInputStream
import InvalidProtocolBufferException
import java.util.*
/**
* Created by user on 7/8/16.
@@ -41,6 +42,7 @@ class ClientHandler : SimpleChannelInboundHandler<Any> {
})
}
} catch (e: InvalidProtocolBufferException) {
println("invalic proto format!")
}
}
else -> {
@@ -51,7 +53,7 @@ class ClientHandler : SimpleChannelInboundHandler<Any> {
}
override fun channelRead0(ctx: ChannelHandlerContext?, msg: Any?) {
if (msg is HttpContent) {
if (msg is DefaultHttpContent) {
val contentsBytes = msg.content();
contentBytes = ByteArray(contentsBytes.capacity())
contentsBytes.readBytes(contentBytes)
+39 -3
View File
@@ -1,10 +1,14 @@
class DirectionRequest private constructor (command: DirectionRequest.Command = DirectionRequest.Command.fromIntToCommand(0)) {
class DirectionRequest private constructor (command: DirectionRequest.Command = DirectionRequest.Command.fromIntToCommand(0), sid: Int = 0) {
var command : DirectionRequest.Command
private set
var sid : Int
private set
init {
this.command = command
this.sid = sid
}
enum class Command(val ord: Int) {
stop (0),
@@ -31,9 +35,12 @@ class DirectionRequest private constructor (command: DirectionRequest.Command =
if (command != DirectionRequest.Command.fromIntToCommand(0)) {
output.writeEnum (1, command.ord)
}
if (sid != 0) {
output.writeInt32 (2, sid)
}
}
class BuilderDirectionRequest constructor (command: DirectionRequest.Command = DirectionRequest.Command.fromIntToCommand(0)) {
class BuilderDirectionRequest constructor (command: DirectionRequest.Command = DirectionRequest.Command.fromIntToCommand(0), sid: Int = 0) {
var command : DirectionRequest.Command
private set
fun setCommand(value: DirectionRequest.Command): DirectionRequest.BuilderDirectionRequest {
@@ -41,19 +48,30 @@ class DirectionRequest private constructor (command: DirectionRequest.Command =
return this
}
var sid : Int
private set
fun setSid(value: Int): DirectionRequest.BuilderDirectionRequest {
sid = value
return this
}
init {
this.command = command
this.sid = sid
}
fun writeTo (output: CodedOutputStream) {
if (command != DirectionRequest.Command.fromIntToCommand(0)) {
output.writeEnum (1, command.ord)
}
if (sid != 0) {
output.writeInt32 (2, sid)
}
}
fun build(): DirectionRequest {
return DirectionRequest(command)
return DirectionRequest(command, sid)
}
fun parseFieldFrom(input: CodedInputStream): Boolean {
@@ -68,6 +86,11 @@ class DirectionRequest private constructor (command: DirectionRequest.Command =
throw InvalidProtocolBufferException("Error: Field number 1 has wire type WireType.VARINT but read ${wireType.toString()}")}
command = DirectionRequest.Command.fromIntToCommand(input.readEnumNoTag())
}
2 -> {
if (wireType != WireType.VARINT) {
throw InvalidProtocolBufferException("Error: Field number 2 has wire type WireType.VARINT but read ${wireType.toString()}")}
sid = input.readInt32NoTag()
}
}
return true}
fun parseFromWithSize(input: CodedInputStream, expectedSize: Int): DirectionRequest.BuilderDirectionRequest {
@@ -86,6 +109,9 @@ class DirectionRequest private constructor (command: DirectionRequest.Command =
if (command != DirectionRequest.Command.fromIntToCommand(0)) {
size += WireFormat.getEnumSize(1, command.ord)
}
if (sid != 0) {
size += WireFormat.getInt32Size(2, sid)
}
size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED)
return size
}
@@ -94,6 +120,9 @@ class DirectionRequest private constructor (command: DirectionRequest.Command =
if (command != DirectionRequest.Command.fromIntToCommand(0)) {
size += WireFormat.getEnumSize(1, command.ord)
}
if (sid != 0) {
size += WireFormat.getInt32Size(2, sid)
}
return size
}
}
@@ -101,6 +130,7 @@ class DirectionRequest private constructor (command: DirectionRequest.Command =
fun mergeWith (other: DirectionRequest) {
command = other.command
sid = other.sid
}
fun mergeFromWithSize (input: CodedInputStream, expectedSize: Int) {
@@ -115,6 +145,9 @@ class DirectionRequest private constructor (command: DirectionRequest.Command =
if (command != DirectionRequest.Command.fromIntToCommand(0)) {
size += WireFormat.getEnumSize(1, command.ord)
}
if (sid != 0) {
size += WireFormat.getInt32Size(2, sid)
}
size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED)
return size
}
@@ -123,6 +156,9 @@ class DirectionRequest private constructor (command: DirectionRequest.Command =
if (command != DirectionRequest.Command.fromIntToCommand(0)) {
size += WireFormat.getEnumSize(1, command.ord)
}
if (sid != 0) {
size += WireFormat.getInt32Size(2, sid)
}
return size
}
}