最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot整合netty過程詳解

 更新時間:2019年12月05日 09:27:16   作者:guodaye  
這篇文章主要介紹了springboot整合netty過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

這篇文章主要介紹了springboot整合netty過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

前言

上一篇講了netty的一個入門的demo;項目上我也把數(shù)據(jù)處理做好了,就要開始存數(shù)據(jù)庫了;我用的mybatis框架,如果單獨(dú)使用還是覺得比較麻煩,所以就用了springboot+mybatis+netty;本篇主要講netty與springboot的整合,以及我在這個過程中遇到的問題,又是怎么去解決的;

正文

我在做springboot與netty整合的時候在谷歌,百度找了無數(shù)文章,都沒有一篇是自己想要的,也達(dá)不到自己所想的目的;

代碼

1. 新建一個springboot項目,在pom文件中添加netty依賴:

    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-all</artifactId>
      <version>5.0.0.Alpha1</version>
    </dependency>

2.新建netty服務(wù)
其實(shí)可以復(fù)制上一篇文章的netty的三個服務(wù)類,做一些稍微的修改就行了;這里為了方便演示,且修都是改好了的,就直接貼出來了;

DiscardServer類:

@Component
public class DiscardServer {
  @Resource
  private ChildChannelHandler childChannelHandler;
  public void run(int port) throws Exception {
    EventLoopGroup bossGroup = new NioEventLoopGroup();
    EventLoopGroup workerGroup = new NioEventLoopGroup();
    System.out.println("準(zhǔn)備運(yùn)行端口:" + port);
    try {
      ServerBootstrap bootstrap = new ServerBootstrap();
      bootstrap.group(bossGroup, workerGroup)
          .channel(NioServerSocketChannel.class)
          .option(ChannelOption.SO_BACKLOG, 128)
          .childHandler(childChannelHandler);
      //綁定端口,同步等待成功
      ChannelFuture f = bootstrap.bind(port).sync();
      //等待服務(wù)監(jiān)聽端口關(guān)閉
      f.channel().closeFuture().sync();
    } finally {
      //退出,釋放線程資源
      workerGroup.shutdownGracefully();
      bossGroup.shutdownGracefully();
    }
  }
}

ChildChannelHandler類

@Component
public class ChildChannelHandler extends ChannelInitializer<SocketChannel> {
  @Resource
  private DiscardServerHandler discardServerHandler;

  public void initChannel(SocketChannel socketChannel) throws Exception {
    socketChannel.pipeline().addLast(discardServerHandler);
  }
}

3.DiscardServerHandler類

特別注意DiscardServerHandler類上需要加@Sharable注解,如果不加的話會報錯;

@Component
@Sharable
public class DiscardServerHandler extends ChannelHandlerAdapter {
  @Resource
  private BaseService baseService;
  @Override
  public void channelRead(ChannelHandlerContext ctx, Object msg) {

    try {
      ByteBuf in = (ByteBuf) msg;
      System.out.println("傳輸內(nèi)容是");
      System.out.println(in.toString(CharsetUtil.UTF_8));
      //這里調(diào)用service服務(wù)
      baseService.test();
    } finally {
      ReferenceCountUtil.release(msg);
    }
  }
  @Override
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    // 出現(xiàn)異常就關(guān)閉
    cause.printStackTrace();
    ctx.close();
  }
}

3.netty調(diào)用所需的服務(wù)類

1.BaseService接口

public interface BaseService {
  /**
   * 測試接口
   */
  void test();
}

2.接口實(shí)現(xiàn)類BaseServiceImpl:

@Service
public class BaseServiceImpl implements BaseService {
  @Override
  public void test() {
    System.out.println("調(diào)用service服務(wù)");
  }
}

4 springboot啟動類

由于main方法是靜態(tài)方法,netty服務(wù)啟動類不是靜態(tài)類,在main方法里面需要用new的方式啟動;

也可以將netty服務(wù)啟動類改為靜態(tài)類,然后調(diào)用其他非靜態(tài)的類時就得用new方法來構(gòu)造其他類了;

我也百度到了幾篇文章說實(shí)現(xiàn)CommandLineRunner接口,所以我用了springboot啟動類實(shí)現(xiàn)CommandLineRunner接口的run方法,然后在run方法里啟動netty服務(wù)

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
  @Resource
  private DiscardServer discardServer;

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }

  @Override
  public void run(String... args) throws Exception {
    discardServer.run(8080);
  }
}

5.測試

寫一個能發(fā)送數(shù)據(jù)的socket就可以了;

發(fā)送的數(shù)據(jù)為:

public static void main(String[] args){
    try {
      Socket socket=new Socket("localhost",8080);
      OutputStream outputStream = socket.getOutputStream();
      PrintWriter printWriter=new PrintWriter(outputStream);
      printWriter.write("$tmb00035ET3318/08/22 11:5804029.94,027.25,20.00,20.00$");
      printWriter.flush();
      socket.shutdownOutput();
      socket.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

我的測試結(jié)果:

傳輸內(nèi)容是
$tmb00035ET3318/08/22 11:5804029.94,027.25,20.00,20.00$
aaaaa

到這里,netty與springboot的整合就完成了;

我在整合過程中遇到的問題

我使用springboot結(jié)合netty的流程

springboot啟動類中啟動netty啟動類(DiscardServer),netty啟動類(DiscardServer)再調(diào)用初始化channel類(ChildChannelHandler),然后初始化channel類再調(diào)用(DiscardServerHandler)類;然后DiscardServerHandler類再調(diào)用service服務(wù);如下示例圖:

問題:

  • springboot啟動類我并沒有實(shí)現(xiàn)CommandLineRunner接口,直接在main方法通過new的方式啟動netty服務(wù)
  • 我實(shí)現(xiàn)了CommandLineRunner接口,但是我在run方法中用的new的方式啟動的netty服務(wù)或者我在run方法使用注入的方式啟動netty,但是在其他某個地方調(diào)用另一個類使用了new的方式;
  • DiscardServerHandler類上為標(biāo)記@Sharable類,會報錯誤;

以上總結(jié)起來的問題就是我在springboot整合netty的過程中有其中一處的調(diào)用其他類時使用的方式是new構(gòu)造的,這樣雖然springboot能啟動,netty也能啟動,但是netty服務(wù)中使用new構(gòu)造的那個類中無法依賴注入,會報空指針異常;

舉個栗子:在圖中的過程中,我在ChildChannelHandler類中通過new的方式調(diào)用DiscardServerHandler類,其他的過程都是使用注入的方式調(diào)用,就會出現(xiàn)上邊的問題;

在遇到空指針的時候,我把spring托管的bean打印了出來,所有的類都在spring的托管中,但是就是無法注入,我也一直沒有明白怎么回事,最后用了一個極端的方法,就是在調(diào)用服務(wù)時,獲取spring的上下文,然后再根據(jù)名字來獲取bean,你谷歌或百度:非托管類調(diào)用spring托管類,就能找到很多文章了;雖然用這個方式能解決上述的問題,但總是不好的;

最后的解決辦法:所以類之間的調(diào)用都使用spring的依賴注入,別用new的方式來調(diào)用或者靜態(tài)方法的方式調(diào)用

總結(jié)

既然項目中用到了spring,那么類與類之間的調(diào)用就用依賴注入,不然會報空指針的問題(就是非托管對象調(diào)用spring托管對象);這也算是一個常識性的問題了,只是自己現(xiàn)在才遇到這樣的問題,還是要踩坑才能遇漲記性??;這些問題困擾了我兩三天,還是要有經(jīng)驗(yàn)的人帶,如果有經(jīng)驗(yàn)的人帶的話,說不幾分鐘就搞定了;

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot內(nèi)嵌SQLite配置使用詳解

    Springboot內(nèi)嵌SQLite配置使用詳解

    這篇文章主要介紹了Springboot內(nèi)嵌SQLite配置使用詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • JAVA中重寫(Override)與重載(Overload)的相關(guān)示例

    JAVA中重寫(Override)與重載(Overload)的相關(guān)示例

    這篇文章主要給大家介紹了關(guān)于JAVA中重寫(Override)與重載(Overload)的相關(guān)示例,重寫(override)和重載(overload)是兩種不同的方法重用技術(shù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • RabbitMQ單機(jī)版部署安裝過程

    RabbitMQ單機(jī)版部署安裝過程

    RabbitMQ 是一個由 Erlang 語言開發(fā)的 AMQP 的開源實(shí)現(xiàn),在實(shí)現(xiàn)過程中需要注意由于rabbitmq是基于erlang語言開發(fā)的,所以必須先安裝erlang,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2022-03-03
  • Java中的throws關(guān)鍵字處理異常的最佳實(shí)踐記錄

    Java中的throws關(guān)鍵字處理異常的最佳實(shí)踐記錄

    在Java編程中,異常處理是保證程序健壯性和穩(wěn)定性的重要手段,除了使用try-catch塊捕獲異常外,Java還提供了throws關(guān)鍵字,允許我們將異常拋給調(diào)用者處理,本文介紹Java中的throws關(guān)鍵字處理異常的最佳實(shí)踐記錄,感興趣的朋友一起看看吧
    2025-01-01
  • 詳解SpringBoot如何實(shí)現(xiàn)多環(huán)境配置

    詳解SpringBoot如何實(shí)現(xiàn)多環(huán)境配置

    在實(shí)際的軟件開發(fā)過程中,一個應(yīng)用程序通常會有多個環(huán)境,pring?Boot?提供了一個非常靈活和強(qiáng)大的方式來管理這些環(huán)境配置,下面就跟隨小編一起學(xué)習(xí)一下吧
    2023-07-07
  • Java接口方法默認(rèn)靜態(tài)實(shí)現(xiàn)代碼實(shí)例

    Java接口方法默認(rèn)靜態(tài)實(shí)現(xiàn)代碼實(shí)例

    這篇文章主要介紹了Java接口方法默認(rèn)靜態(tài)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • java如何防止表單重復(fù)提交的注解@RepeatSubmit

    java如何防止表單重復(fù)提交的注解@RepeatSubmit

    @RepeatSubmit是一個自定義注解,用于防止表單重復(fù)提交,它通過AOP和攔截器模式實(shí)現(xiàn),結(jié)合了線程安全和分布式環(huán)境的考慮,注解參數(shù)包括interval(間隔時間)和message(提示信息),使用時需要注意并發(fā)處理、用戶體驗(yàn)、性能和安全性等方面,失效原因是多方面的
    2024-11-11
  • 一文吃透Spring?Cloud?gateway自定義錯誤處理Handler

    一文吃透Spring?Cloud?gateway自定義錯誤處理Handler

    這篇文章主要為大家介紹了一文吃透Spring?Cloud?gateway自定義錯誤處理Handler方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 解讀maven項目啟動tomcat不報錯但是啟動不起來,tomcat啟動到警告log4j就停止了

    解讀maven項目啟動tomcat不報錯但是啟動不起來,tomcat啟動到警告log4j就停止了

    這篇文章主要介紹了maven項目啟動tomcat不報錯但是啟動不起來,tomcat啟動到警告log4j就停止了問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Eclipse將Maven項目打成jar包的方法

    Eclipse將Maven項目打成jar包的方法

    這篇文章主要介紹了Eclipse將Maven項目打成jar包的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2007-09-09

最新評論

长岛县| 文水县| 揭西县| 津市市| 上饶县| 开封市| 镇赉县| 金平| 洪洞县| 栾城县| 托克托县| 乌兰浩特市| 乌什县| 双峰县| 太谷县| 台山市| 彩票| 离岛区| 固安县| 阿勒泰市| 长汀县| 鄂州市| 铅山县| 通州市| 沛县| 北流市| 乐清市| 华容县| 潜江市| 托里县| 清镇市| 延安市| 固镇县| 海盐县| 泽库县| 承德县| 木里| 河东区| 新兴县| 尉犁县| 明星|