Commit 6314a96d authored by p x's avatar p x
Browse files

和APK:联调一次

parent eb5a2d1c
This diff is collapsed.
...@@ -52,7 +52,7 @@ class ScheduledAdasPushTask( ...@@ -52,7 +52,7 @@ class ScheduledAdasPushTask(
// @Scheduled(fixedDelayString = "#{@pushConfig.pushInterval}") // @Scheduled(fixedDelayString = "#{@pushConfig.pushInterval}")
// @Scheduled(fixedDelayString = "#{@pushConfig.pushInterval}") // @Scheduled(fixedDelayString = "#{@pushConfig.pushInterval}")
fun pushMsgToType1() { fun pushMsgToType1() {
val onlineChannels = channelManager.getAllChannels() /* val onlineChannels = channelManager.getAllChannels()
//得到设置了type属性的channel //得到设置了type属性的channel
val typeChannels = filterTypeChannels(PARAM_TYPE_VALUE_1) val typeChannels = filterTypeChannels(PARAM_TYPE_VALUE_1)
// println("onlineChannels.size = ${onlineChannels.size} typeChannels.size = ${typeChannels.size}") // println("onlineChannels.size = ${onlineChannels.size} typeChannels.size = ${typeChannels.size}")
...@@ -63,25 +63,25 @@ class ScheduledAdasPushTask( ...@@ -63,25 +63,25 @@ class ScheduledAdasPushTask(
channelManager.sendMsgFromType(typeChannels, carDst.get(carDstIndex)) channelManager.sendMsgFromType(typeChannels, carDst.get(carDstIndex))
carDstIndex = (carDstIndex + 1) % carDst.size // 循环索引 carDstIndex = (carDstIndex + 1) % carDst.size // 循环索引
} }*/
} }
// @Scheduled(fixedDelayString = "200") // @Scheduled(fixedDelayString = "200")
fun pushMsgToType2() { /* fun pushMsgToType2() {
//得到设置了type属性的channel //得到设置了type属性的channel
val typeChannels = filterTypeChannels(PARAM_TYPE_VALUE_2) val typeChannels = filterTypeChannels(PARAM_TYPE_VALUE_2)
// println("onlineChannels.size = ${onlineChannels.size} typeChannels.size = ${typeChannels.size}") // println("onlineChannels.size = ${onlineChannels.size} typeChannels.size = ${typeChannels.size}")
val msgObj = JSONObject() val msgObj = JSONObject()
msgObj["content"] = "定时推送消息 type=2 ${LocalDateTime.now()}" msgObj["content"] = "定时推送消息 type=2 ${LocalDateTime.now()}"
channelManager.sendMsgFromType(typeChannels, msgObj.toJSONString()) channelManager.sendMsgFromType(typeChannels, msgObj.toJSONString())
} }*/
/** /**
* @param type 前端的查询参数 * @param type 前端的查询参数
* **/ * **/
private fun filterTypeChannels(type: String): Map<String, Channel> { /* private fun filterTypeChannels(type: String): Map<String, Channel> {
val onlineChannels = channelManager.getAllChannels() val onlineChannels = channelManager.getAllChannels()
//得到设置了type属性的channel //得到设置了type属性的channel
val typeChannels = val typeChannels =
...@@ -93,7 +93,7 @@ class ScheduledAdasPushTask( ...@@ -93,7 +93,7 @@ class ScheduledAdasPushTask(
false false
} }
return typeChannels return typeChannels
} }*/
/** /**
......
...@@ -5,6 +5,9 @@ import com.alibaba.fastjson2.JSONObject ...@@ -5,6 +5,9 @@ import com.alibaba.fastjson2.JSONObject
import com.inzy.wsmock.ChannelManager import com.inzy.wsmock.ChannelManager
import com.inzy.wsmock.PushConfig import com.inzy.wsmock.PushConfig
import com.inzy.wsmock.RequestParamHandler import com.inzy.wsmock.RequestParamHandler
import com.inzy.wsmock.RequestParamHandler.Companion.PARAM_TYPE_KEY
import com.inzy.wsmock.RequestParamHandler.Companion.PARAM_TYPE_VALUE_3
import com.inzy.wsmock.RequestParamHandler.Companion.REQUEST_PARAMS_KEY
import com.inzy.wsmock.bean.DriveInOrOut import com.inzy.wsmock.bean.DriveInOrOut
import com.inzy.wsmock.utils.FileIoUtil import com.inzy.wsmock.utils.FileIoUtil
import io.netty.channel.Channel import io.netty.channel.Channel
...@@ -19,14 +22,16 @@ import java.util.concurrent.atomic.AtomicBoolean ...@@ -19,14 +22,16 @@ import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger
@Component @Component
//@Scope("prototype")
class AdasPushTask( class AdasPushTask(
// 注入Spring资源加载器(Spring自动装配) // 注入Spring资源加载器(Spring自动装配)
private val resourceLoader: ResourceLoader, private val resourceLoader: ResourceLoader,
private val pushConfig: PushConfig, private val pushConfig: PushConfig,
) : PushTask { ) : PushTask {
private val instanceId = System.currentTimeMillis() // 实例唯一标识,用于验证多实例
private val logger = LoggerFactory.getLogger(javaClass) private val logger = LoggerFactory.getLogger(javaClass)
// 注入ChannelManager单例 // 注入ChannelManager单例
private val channelManager = ChannelManager.instance private val channelManager = ChannelManager.instance
...@@ -34,7 +39,8 @@ class AdasPushTask( ...@@ -34,7 +39,8 @@ class AdasPushTask(
private var carDst = mutableListOf<String>() private var carDst = mutableListOf<String>()
//车辆行驶的位置 //车辆行驶的位置
private var carIndex = AtomicInteger(0) // private var carIndex = AtomicInteger(0)
private var carPos = 0
//感知物 //感知物
private var preDst = mutableListOf<String>() private var preDst = mutableListOf<String>()
...@@ -47,6 +53,7 @@ class AdasPushTask( ...@@ -47,6 +53,7 @@ class AdasPushTask(
@PostConstruct @PostConstruct
fun readMockFile() { fun readMockFile() {
logger.info("创建 AdasPushTask 实例,ID: $instanceId")
var classpathResource = resourceLoader.getResource("classpath:adasm/CarVehicle_fz.txt") var classpathResource = resourceLoader.getResource("classpath:adasm/CarVehicle_fz.txt")
// 读取文件内容(Kotlin简化写法) // 读取文件内容(Kotlin简化写法)
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {
...@@ -59,6 +66,7 @@ class AdasPushTask( ...@@ -59,6 +66,7 @@ class AdasPushTask(
@PreDestroy @PreDestroy
fun destroy() { fun destroy() {
// logger.info("销毁 AdasPushTask 实例,ID: $instanceId")
carDst.clear() carDst.clear()
preDst.clear() preDst.clear()
} }
...@@ -96,26 +104,31 @@ class AdasPushTask( ...@@ -96,26 +104,31 @@ class AdasPushTask(
CoroutineScope(Dispatchers.Default).launch { CoroutineScope(Dispatchers.Default).launch {
while (isActive) { while (isActive) {
if (pushConfig.pushStart.get() == 0) { if (pushConfig.pushStart.get() == 0) {
println("------------没开始推") // println("------------没开始推")
// carIndex = 0 // carIndex = 0
isFence.set(false) carPos = 0
isV2x.set(false) isV2x.set(false)
// carIndex.set(0)
isFence.set(false)
delay(200)
// sendMsg(channel, carDst.first()) // sendMsg(channel, carDst.first())
delay(1000)
continue continue
} }
if (carDst.isNotEmpty()) { if (carDst.isNotEmpty()) {
carDst.forEachIndexed { index, string -> carDst.forEachIndexed { index, string ->
// println("carIndex = ${carIndex}") // println("carIndex = ${carIndex}")
if (pushConfig.pushStart.get() == 0){ if (pushConfig.pushStart.get() == 0) {
return@forEachIndexed return@forEachIndexed
} }
carIndex.set(index) //推送电子围栏
carPos = index
// takeFen(index)
// carIndex.set(index)
sendMsg(channel, string) sendMsg(channel, string)
delay(200) delay(200)
} }
println("---- pushConfig.pushStart.set(0)") // println("---- pushConfig.pushStart.set(0)")
carIndex.set(0) // carIndex.set(0)
pushConfig.pushStart.set(0) pushConfig.pushStart.set(0)
} }
} }
...@@ -141,10 +154,12 @@ class AdasPushTask( ...@@ -141,10 +154,12 @@ class AdasPushTask(
private fun pushFence(channel: Channel) { private fun pushFence(channel: Channel) {
CoroutineScope(Dispatchers.Default).launch { CoroutineScope(Dispatchers.Default).launch {
while (isActive) { while (isActive) {
// println("---电子围栏carIndex = ${carIndex.get()}") // println("---carPos = ${carPos}")
if (carIndex.get() == 0) if (carPos == 0) {
delay(100)
continue continue
if (carIndex.get() == 130) {//驶入 130 }
if (carPos == 30) {//驶入 130
if (isFence.compareAndSet(false, true)) { if (isFence.compareAndSet(false, true)) {
val driveInOrOut = DriveInOrOut().apply { val driveInOrOut = DriveInOrOut().apply {
finished = true finished = true
...@@ -152,7 +167,7 @@ class AdasPushTask( ...@@ -152,7 +167,7 @@ class AdasPushTask(
sendMsg(channel, JSON.toJSONString(driveInOrOut)) sendMsg(channel, JSON.toJSONString(driveInOrOut))
isFence.set(false) isFence.set(false)
} }
} else if (carIndex.get() == 500) {//驶出 200 } else if (carPos == 500) {//驶出 500
if (isFence.compareAndSet(false, true)) { if (isFence.compareAndSet(false, true)) {
val driveInOrOut = DriveInOrOut().apply { val driveInOrOut = DriveInOrOut().apply {
finished = false finished = false
...@@ -160,7 +175,36 @@ class AdasPushTask( ...@@ -160,7 +175,36 @@ class AdasPushTask(
sendMsg(channel, JSON.toJSONString(driveInOrOut)) sendMsg(channel, JSON.toJSONString(driveInOrOut))
} }
} }
delay(150) delay(50)
}
}
}
private fun takeFen(index: Int) {
if (index == 0) {
isFence.set(false)
return
}
if (index == 130) {
if (isFence.compareAndSet(false, true)) {
val driveInOrOut = DriveInOrOut().apply {
finished = true
}
val fenChannels = filterTypeChannels(PARAM_TYPE_VALUE_3)
fenChannels.forEach { string, channel ->
sendMsg(channel, JSON.toJSONString(driveInOrOut))
}
isFence.set(false)
}
} else if (index == 500) {
if (isFence.compareAndSet(false, true)) {
val driveInOrOut = DriveInOrOut().apply {
finished = true
}
val fenChannels = filterTypeChannels(PARAM_TYPE_VALUE_3)
fenChannels.forEach { string, channel ->
sendMsg(channel, JSON.toJSONString(driveInOrOut))
}
} }
} }
} }
...@@ -193,22 +237,22 @@ class AdasPushTask( ...@@ -193,22 +237,22 @@ class AdasPushTask(
CoroutineScope(Dispatchers.Default).launch { CoroutineScope(Dispatchers.Default).launch {
while (isActive) { while (isActive) {
if (pushConfig.pushStart.get() == 0) { if (pushConfig.pushStart.get() == 0) {
delay(1000) delay(100)
continue continue
} }
if (carIndex.get() < 100) if (carPos < 100)
continue continue
if (carIndex.get() == 200) {//施工 if (carPos == 200) {//施工
pushV2xAtomic(channel, SHIGONG_V2X) pushV2xAtomic(channel, SHIGONG_V2X)
} else if (carIndex.get() == 230) {//交叉路口 } else if (carPos == 230) {//交叉路口
pushV2xAtomic(channel, JIAOCHALUKOU_V2X) pushV2xAtomic(channel, JIAOCHALUKOU_V2X)
} else if (carIndex.get() == 260) {//人行横道 } else if (carPos == 260) {//人行横道
pushV2xAtomic(channel, RENXINGHENGDAO_V2X) pushV2xAtomic(channel, RENXINGHENGDAO_V2X)
} else if (carIndex.get() == 320) {//前向碰撞 } else if (carPos == 320) {//前向碰撞
pushV2xAtomic(channel, QIANPENG_V2X) pushV2xAtomic(channel, QIANPENG_V2X)
} else if (carIndex.get() == 350) {//弱势交通 } else if (carPos == 350) {//弱势交通
pushV2xAtomic(channel, RUOSHI_V2X) pushV2xAtomic(channel, RUOSHI_V2X)
} else if (carIndex.get() == 400) {//车内限速标牌 } else if (carPos == 400) {//车内限速标牌
pushV2xAtomic(channel, XIANSU_V2X, false) pushV2xAtomic(channel, XIANSU_V2X, false)
} }
delay(150) delay(150)
...@@ -228,6 +272,25 @@ class AdasPushTask( ...@@ -228,6 +272,25 @@ class AdasPushTask(
} }
/**
* 返回某个type的channel
* @param type 前端的查询参数
**/
private fun filterTypeChannels(type: String): Map<String, Channel> {
val onlineChannels = channelManager.getAllChannels()
//得到设置了type属性的channel
val typeChannels =
onlineChannels.filter { (id, channel) ->
if (channel.hasAttr(REQUEST_PARAMS_KEY)) {
val params = channel.attr(REQUEST_PARAMS_KEY).get()
return@filter params.get(PARAM_TYPE_KEY) == type
}
false
}
return typeChannels
}
private fun sendMsg(channel: Channel, msg: String) { private fun sendMsg(channel: Channel, msg: String) {
if (!channel.isActive()) { if (!channel.isActive()) {
// println("无在线客户端,跳过推送") // println("无在线客户端,跳过推送")
......
...@@ -2,6 +2,9 @@ package com.inzy.wsmock.push ...@@ -2,6 +2,9 @@ package com.inzy.wsmock.push
import com.inzy.wsmock.RequestParamHandler import com.inzy.wsmock.RequestParamHandler
import io.netty.channel.Channel import io.netty.channel.Channel
import jakarta.annotation.PreDestroy
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.ApplicationContext
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
@Component @Component
...@@ -9,6 +12,12 @@ class PushFactory( ...@@ -9,6 +12,12 @@ class PushFactory(
private val adasPushTask: AdasPushTask private val adasPushTask: AdasPushTask
) { ) {
// @Autowired
// private lateinit var applicationContext: ApplicationContext
// private var adasPushTask: AdasPushTask? = null
/**根据路径推送***/ /**根据路径推送***/
fun pushMsgFormPath(channel: Channel) { fun pushMsgFormPath(channel: Channel) {
var path = "" var path = ""
...@@ -30,6 +39,8 @@ class PushFactory( ...@@ -30,6 +39,8 @@ class PushFactory(
private fun createPushProduct(path: String): PushTask { private fun createPushProduct(path: String): PushTask {
when (path) { when (path) {
"/ws/adas" -> { "/ws/adas" -> {
// 关键:每次调用 getBean 都会创建新的 AdasPushTask 实例
// return applicationContext.getBean(AdasPushTask::class.java)
return adasPushTask return adasPushTask
} }
...@@ -39,5 +50,11 @@ class PushFactory( ...@@ -39,5 +50,11 @@ class PushFactory(
} }
} }
// @PreDestroy
// fun destroy() {
//// println("-=---PushFactory.destroy")
// adasPushTask?.destroy()
// }
} }
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment