# -*- coding: utf-8 -*- import pathlib ROOT = pathlib.Path(r"D:\hdProject\newsaas\ylrz_saas\java\fs-worker-app\src\main\java\com\fs\worker\websocket\support") BOOTSTRAP = ( "package com.fs.worker.websocket.support;\n\n" "import com.fs.common.constant.WorkerWsConstants;\n" "import lombok.extern.slf4j.Slf4j;\n" "import org.springframework.beans.factory.annotation.Autowired;\n" "import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;\n" "import org.springframework.boot.context.event.ApplicationReadyEvent;\n" "import org.springframework.context.event.EventListener;\n" "import org.springframework.data.redis.connection.RedisConnectionFactory;\n" "import org.springframework.data.redis.listener.ChannelTopic;\n" "import org.springframework.data.redis.listener.RedisMessageListenerContainer;\n" "import org.springframework.stereotype.Component;\n\n" "import javax.annotation.PreDestroy;\n\n" "/**\n" " * \u5e94\u7528\u5c31\u7eea\u540e\u6ce8\u518c Redis \u8ba2\u9605\uff0c\u907f\u514d\u542f\u52a8\u9636\u6bb5\u8ba2\u9605\u8d85\u65f6\u5bfc\u81f4 fs-worker-app \u65e0\u6cd5\u542f\u52a8\u3002\n" " */\n" "@Slf4j\n" "@Component\n" "@ConditionalOnBean(RedisConnectionFactory.class)\n" "public class WorkerWsRedisBootstrap {\n\n" " private static final long SUBSCRIPTION_WAIT_MS = 30000L;\n\n" " @Autowired\n" " private RedisConnectionFactory redisConnectionFactory;\n\n" " @Autowired\n" " private WorkerTaskRunWsSubscriber workerTaskRunWsSubscriber;\n\n" " private RedisMessageListenerContainer container;\n\n" " @EventListener(ApplicationReadyEvent.class)\n" " public void onApplicationReady() {\n" " if (container != null) {\n" " return;\n" " }\n" " try {\n" " RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();\n" " listenerContainer.setConnectionFactory(redisConnectionFactory);\n" " listenerContainer.setMaxSubscriptionRegistrationWaitingTime(SUBSCRIPTION_WAIT_MS);\n" " listenerContainer.setRecoveryInterval(5000L);\n" " listenerContainer.addMessageListener(workerTaskRunWsSubscriber,\n" " new ChannelTopic(WorkerWsConstants.REDIS_CHANNEL_TASK_RUN));\n" " listenerContainer.afterPropertiesSet();\n" " listenerContainer.start();\n" " container = listenerContainer;\n" " log.info(\"[WorkerTaskRunWS] Redis \u8ba2\u9605\u6210\u529f channel={}\", WorkerWsConstants.REDIS_CHANNEL_TASK_RUN);\n" " } catch (Exception e) {\n" " log.warn(\"[WorkerTaskRunWS] Redis \u8ba2\u9605\u5931\u8d25\uff0cPC \u4efb\u52a1\u542f\u52a8 WS \u63a8\u9001\u6682\u4e0d\u53ef\u7528\uff0c\u8bf7\u68c0\u67e5 Redis \u662f\u5426\u542f\u52a8\u4e14\u4e0e fs-saas-company \u540c\u4e00\u5b9e\u4f8b: {}\",\n" " e.getMessage());\n" " log.debug(\"[WorkerTaskRunWS] Redis \u8ba2\u9605\u5f02\u5e38\u8be6\u60c5\", e);\n" " }\n" " }\n\n" " @PreDestroy\n" " public void destroy() {\n" " if (container != null) {\n" " try {\n" " container.stop();\n" " container.destroy();\n" " log.info(\"[WorkerTaskRunWS] Redis \u8ba2\u9605\u5df2\u505c\u6b62\");\n" " } catch (Exception e) {\n" " log.warn(\"[WorkerTaskRunWS] \u505c\u6b62 Redis \u8ba2\u9605\u5f02\u5e38: {}\", e.getMessage());\n" " } finally {\n" " container = null;\n" " }\n" " }\n" " }\n" "}\n" ) SUBSCRIBER = ( "package com.fs.worker.websocket.support;\n\n" "import com.alibaba.fastjson.JSON;\n" "import com.fs.workApp.dto.WorkerTaskRunWsMessage;\n" "import com.fs.worker.websocket.service.WorkerWebSocketServer;\n" "import lombok.extern.slf4j.Slf4j;\n" "import org.springframework.data.redis.connection.Message;\n" "import org.springframework.data.redis.connection.MessageListener;\n" "import org.springframework.stereotype.Component;\n\n" "import java.nio.charset.StandardCharsets;\n\n" "/**\n" " * \u8ba2\u9605 Redis\uff1aPC \u542f\u52a8 APP \u5916\u547c\u4efb\u52a1\u540e\uff0c\u5411\u7ed1\u5b9a\u8bbe\u5907\u63a8\u9001 WebSocket\n" " */\n" "@Slf4j\n" "@Component\n" "public class WorkerTaskRunWsSubscriber implements MessageListener {\n\n" " @Override\n" " public void onMessage(Message message, byte[] pattern) {\n" " String body = new String(message.getBody(), StandardCharsets.UTF_8);\n" " try {\n" " String jsonStr = body;\n" " if (body.startsWith(\"\\\"\") && body.endsWith(\"\\\"\")) {\n" " jsonStr = JSON.parseObject(body, String.class);\n" " }\n" " WorkerTaskRunWsMessage syncMessage = JSON.parseObject(jsonStr, WorkerTaskRunWsMessage.class);\n" " if (syncMessage == null || syncMessage.getRoboticId() == null\n" " || syncMessage.getCallModel() == null || syncMessage.getMeIds() == null) {\n" " log.warn(\"[WorkerTaskRunWS] \u65e0\u6548\u6d88\u606f body={}\", body);\n" " return;\n" " }\n" " log.info(\"[WorkerTaskRunWS] \u6536\u5230\u6d88\u606f roboticId={} callModel={} meIds={}\",\n" " syncMessage.getRoboticId(), syncMessage.getCallModel(), syncMessage.getMeIds());\n" " WorkerWebSocketServer.pushTaskRunToDevices(\n" " syncMessage.getMeIds(),\n" " syncMessage.getRoboticId(),\n" " syncMessage.getCallModel());\n" " } catch (Exception e) {\n" " log.error(\"[WorkerTaskRunWS] \u5904\u7406\u6d88\u606f\u5931\u8d25 body={}\", body, e);\n" " }\n" " }\n" "}\n" ) (ROOT / "WorkerWsRedisBootstrap.java").write_text(BOOTSTRAP, encoding="utf-8", newline="\n") (ROOT / "WorkerTaskRunWsSubscriber.java").write_text(SUBSCRIBER, encoding="utf-8", newline="\n") print("done")