springboot 통합 netty 프로 세 스 상세 설명

7295 단어 springboot통합netty
이 글 은 주로 springboot 통합 netty 과정 에 대한 상세 한 설명 을 소개 합 니 다.
머리말
넷 티 의 입문 데모 에 대해 이야기 했다.프로젝트 에서 나 도 데 이 터 를 잘 처리 하면 데이터 베 이 스 를 저장 하기 시작 할 것 이다.제 가 사용 하 는 my batis 프레임 워 크 는 단독으로 사용 하 는 것 이 귀 찮 기 때문에 spring boot+my batis+netty 를 사 용 했 습 니 다.이 편 은 주로 netty 와 springboot boot 의 통합,그리고 내 가 이 과정 에서 만난 문 제 를 어떻게 해결 하 는 지 를 말한다.
본문
제 가 spring boot 와 netty 를 통합 할 때 구 글 에서 바 이 두 는 수많은 글 을 찾 았 습 니 다.제 가 원 하 는 것 도 없고 제 가 생각 하 는 목적 도 이 루 지 못 했 습 니 다.
코드
1.springboot 프로젝트 를 새로 만 들 고 pom 파일 에 netty 의존 도 를 추가 합 니 다.

    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-all</artifactId>
      <version>5.0.0.Alpha1</version>
    </dependency>
2.새 netty 서비스
사실 이전 글 의 netty 의 세 가지 서비스 종 류 를 복사 하여 조금 만 수정 하면 됩 니 다.여기 서 프 리 젠 테 이 션 을 편리 하 게 하기 위해 고 친 것 이 고 바로 붙 였 습 니 다.
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("      :" + 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();
      //          
      f.channel().closeFuture().sync();
    } finally {
      //  ,      
      workerGroup.shutdownGracefully();
      bossGroup.shutdownGracefully();
    }
  }
}
ChildChannel Handler 클래스

@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("     ");
      System.out.println(in.toString(CharsetUtil.UTF_8));
      //    service  
      baseService.test();
    } finally {
      ReferenceCountUtil.release(msg);
    }
  }
  @Override
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    //        
    cause.printStackTrace();
    ctx.close();
  }
}
3.netty 호출 에 필요 한 서비스 클래스
1.BaseService 인터페이스

public interface BaseService {
  /**
   *     
   */
  void test();
}
2.인터페이스 구현 클래스 BaseServiceImpl:

@Service
public class BaseServiceImpl implements BaseService {
  @Override
  public void test() {
    System.out.println("  service  ");
  }
}
4 springboot 시작 클래스
main 방법 은 정적 방법 이기 때문에 netty 서비스 시작 류 는 정적 클래스 가 아니 라 main 방법 에서 new 방식 으로 시작 해 야 합 니 다.
또한 netty 서비스 시작 클래스 를 정적 클래스 로 바 꾸 고 다른 비 정적 클래스 를 호출 할 때 new 방법 으로 다른 클래스 를 구성 해 야 합 니 다.
저도 바 이 두 에서 몇 편의 글 을 통 해 CommandLine Runner 인 터 페 이 스 를 실현 하 겠 다 고 했 습 니 다.그래서 저 는 springboot 시작 클래스 로 CommandLine Runner 인 터 페 이 스 를 실현 하 는 run 방법 을 사용 한 다음 에 run 방법 에서 netty 서 비 스 를 시 작 했 습 니 다.

@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.테스트
데 이 터 를 보 낼 수 있 는 socket 을 쓰 면 됩 니 다.
보 낸 데 이 터 는:

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();
    }
  }
나의 테스트 결과:

     
$tmb00035ET3318/08/22 11:5804029.94,027.25,20.00,20.00$
aaaaa
여기까지 netty 와 springboot 의 통합 이 완료 되 었 습 니 다.
내 가 통합 과정 에서 만난 문제
저 는 spring boot 를 사용 하여 netty 와 결합 하 는 프로 세 스 를 사용 합 니 다.
springboot 시작 클래스 에서 netty 시작 클래스(DiscardServer)를 시작 합 니 다.netty 시작 클래스(DiscardServer)는 채널 클래스(ChildChannel Handler)를 초기 화하 고 채널 클래스 를 초기 화 한 다음(DiscardServerHandler)클래스 를 호출 합 니 다.그리고 DiscardServerHandler 클래스 에서 서비스 서 비 스 를 호출 합 니 다.다음 예제 그림:

질문:
  • springboot 부팅 클래스 에서 저 는 CommandLine Runner 인 터 페 이 스 를 실현 하지 못 했 습 니 다.main 방법 에서 new 방식 으로 netty 서 비 스 를 직접 시작 합 니 다
  • 저 는 CommandLine Runner 인 터 페 이 스 를 실 현 했 습 니 다.그러나 저 는 run 방법 에서 new 방식 으로 시 작 된 netty 서비스 나 run 방법 에서 주입 방식 으로 netty 를 시 작 했 지만 다른 곳 에서 다른 종 류 를 호출 하여 new 방식 을 사 용 했 습 니 다
  • DiscardServerHandler 클래스 에@Sharable 클래스 를 표시 하면 오류 가 발생 합 니 다
  • 이상 에서 정리 한 문 제 는 바로 제 가 spring boot 에서 netty 를 통합 하 는 과정 에서 그 중의 한 곳 이 다른 유형 을 호출 할 때 사용 하 는 방식 이 new 구조 입 니 다.그러면 spring boot 가 작 동 할 수 있 고 netty 도 작 동 할 수 있 지만 netty 서비스 에서 new 구 조 를 사용 하 는 유형 에 따라 주입 할 수 없고 빈 지침 이상 을 알 릴 수 있 습 니 다.
    밤 을 들 어 라:그림 에서 저 는 ChildChannel Handler 류 에서 new 방식 으로 Discardserver Handler 류 를 호출 합 니 다.다른 과정 은 모두 주입 방식 으로 호출 하면 위의 문제 가 발생 할 수 있 습 니 다.
    빈 지침 을 만 났 을 때 저 는 spring 위탁 관리 bean 을 인쇄 했 습 니 다.모든 종 류 는 spring 의 위탁 관리 에 있 지만 주입 할 수 없 었 습 니 다.저도 어떻게 된 일 인지 몰 랐 습 니 다.마지막 으로 극단 적 인 방법 을 사 용 했 습 니 다.서 비 스 를 호출 할 때 spring 의 컨 텍스트 를 얻 은 다음 에 이름 에 따라 bean 을 얻 었 습 니 다.구 글 이나 바 이 두:비 위탁 관리 류 가 spring 위탁 관리 류 를 호출 하면 많은 글 을 찾 을 수 있 습 니 다.이 방식 으로 상술 한 문 제 를 해결 할 수 있 지만 항상 좋 지 않다.
    마지막 해결 방법:따라서 클래스 간 호출 은 모두 spring 의 의존 주입 을 사용 합 니 다.new 방식 으로 호출 하거나 정적 방법 으로 호출 하지 마 십시오.
    총결산
    프로젝트 에 spring 을 사 용 했 으 니 클래스 와 클래스 간 의 호출 은 의존 주입 으로 해 야 합 니 다.그렇지 않 으 면 빈 지침 의 문제(비 위탁 관리 대상 이 spring 위탁 관리 대상 을 호출 하 는 것)를 보고 할 수 있 습 니 다.이것 도 상식 적 인 문제 라 고 할 수 있 습 니 다.다만 자신 이 지금 에 야 이런 문 제 를 만 났 을 뿐 입 니 다.아니면 구 덩이 를 밟 아야 기억력 이 향상 되 는 것 입 니까?이 문제 들 은 나 를 2,3 일 동안 괴 롭 혔 지만 경험 이 있 는 사람 이 가 져 가 야 한다.경험 이 있 는 사람 이 가 져 가면 몇 분 안 돼 서 해결 된다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기