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

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 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改