雨成风 2022-06-08 18:25 采纳率: 100%
浏览 78
已结题

socket(线程)接收数据后无法调用service层

socket接收到设备上报的数据,无法调用service层进行查询等操作

public class ServerSocketConfig {

    private static Logger log = LoggerFactory.getLogger(ServerSocketConfig.class);

    public static ServerSocket serverSocket = null;

    /**
     * corePoolSize :线程池中核心线程数的最大值
     * maximumPoolSize :线程池中能拥有最多线程数
     * keepAliveTime :表示空闲线程的存活时间
     * TimeUnit unit :表示keepAliveTime的单位
     * workQueue:用于缓存任务的阻塞队列
     */
    private static final ThreadPoolExecutor threadpool = new ThreadPoolExecutor(15, 15,
            60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());

    @Bean
    public void socketCreate() {
        try {
            serverSocket = new ServerSocket(9000);
            log.info("socket服务端开启");
            while (true){
                Socket socket = serverSocket.accept();
                System.out.println("接收到客户端socket" + socket.getRemoteSocketAddress());
                threadpool.execute(new ReceiveThread(socket, new StationServiceImpl()));
            }
        } catch (IOException e) {
            log.info("socket服务启动异常");
            e.printStackTrace();
        }
    }
}


class ReceiveThread implements Runnable {

    private static Logger log = LoggerFactory.getLogger(ReceiveThread.class);

    private Socket socket;

    private IStationService stationService;

    public ReceiveThread(Socket socket, IStationService stationService) {
        this.socket = socket;
        this.stationService = stationService;
    }

    @Override
    public synchronized void run() {
        try {
            InputStream is = socket.getInputStream();
            byte[] buf = new byte[1024];
            int line = 0;
            while((line=is.read(buf))!=-1){
                //将接收到的数据在控制台输出
                // byte[] 转换 (C语言中,byte类型没有符号位,最大值为255,java中byte类型带有符号位,最大值为127,问题就出现了)
                int[] dataFormat=new int[500];
                for(int i=0;i<line;i++){
                    if(buf[i]<0){
                        dataFormat[i]=buf[i]&0xff;
                    }else{
                        dataFormat[i]=buf[i];
                    }
                    System.out.print(dataFormat[i]+" ");
                }
                System.out.println("");

                // 十进制转字符
                String IMEI = "";
                for (int i = 0; i < line; i++) {
                    if(i > 3 && i < 19) {
                        IMEI += (char)dataFormat[i];
                    }
                }
                System.out.println("IMEI : "+IMEI);
                Station station = stationService.selectStationByIMEI(IMEI);
            }
            log.info("服务端关闭客户端[{}]", socket.getRemoteSocketAddress());
            socket.close();
        } catch (Exception e) {
            log.info("接收数据异常socket关闭");
            e.printStackTrace();
        }
    }
}

重点就在

Station station = stationService.selectStationByIMEI(IMEI);

运行时,在service层 stationMapper 为 null。

img

代码报错

img

我猜测可能是线程内不能直接调用外部方法,但不知道怎么解决。如果这样解决不了就要考虑通过HTTP将数据发送到其他接口去进行处理了。

  • 写回答

2条回答 默认 最新

  • 懒羊羊的南瓜屋 2022-06-08 18:37
    关注

    stationService 不能简单的new StationServiceImpl()来创建
    需要通过框架去找到这个bean,这样你的mapper才可以用

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月16日
  • 已采纳回答 6月8日
  • 创建了问题 6月8日

悬赏问题

  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)
  • ¥20 web页面如何打开Outlook 365的全球离线通讯簿功能
  • ¥15 io.jsonwebtoken.security.Keys