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 클래스 에서 서비스 서 비 스 를 호출 합 니 다.다음 예제 그림:
질문:
밤 을 들 어 라:그림 에서 저 는 ChildChannel Handler 류 에서 new 방식 으로 Discardserver Handler 류 를 호출 합 니 다.다른 과정 은 모두 주입 방식 으로 호출 하면 위의 문제 가 발생 할 수 있 습 니 다.
빈 지침 을 만 났 을 때 저 는 spring 위탁 관리 bean 을 인쇄 했 습 니 다.모든 종 류 는 spring 의 위탁 관리 에 있 지만 주입 할 수 없 었 습 니 다.저도 어떻게 된 일 인지 몰 랐 습 니 다.마지막 으로 극단 적 인 방법 을 사 용 했 습 니 다.서 비 스 를 호출 할 때 spring 의 컨 텍스트 를 얻 은 다음 에 이름 에 따라 bean 을 얻 었 습 니 다.구 글 이나 바 이 두:비 위탁 관리 류 가 spring 위탁 관리 류 를 호출 하면 많은 글 을 찾 을 수 있 습 니 다.이 방식 으로 상술 한 문 제 를 해결 할 수 있 지만 항상 좋 지 않다.
마지막 해결 방법:따라서 클래스 간 호출 은 모두 spring 의 의존 주입 을 사용 합 니 다.new 방식 으로 호출 하거나 정적 방법 으로 호출 하지 마 십시오.
총결산
프로젝트 에 spring 을 사 용 했 으 니 클래스 와 클래스 간 의 호출 은 의존 주입 으로 해 야 합 니 다.그렇지 않 으 면 빈 지침 의 문제(비 위탁 관리 대상 이 spring 위탁 관리 대상 을 호출 하 는 것)를 보고 할 수 있 습 니 다.이것 도 상식 적 인 문제 라 고 할 수 있 습 니 다.다만 자신 이 지금 에 야 이런 문 제 를 만 났 을 뿐 입 니 다.아니면 구 덩이 를 밟 아야 기억력 이 향상 되 는 것 입 니까?이 문제 들 은 나 를 2,3 일 동안 괴 롭 혔 지만 경험 이 있 는 사람 이 가 져 가 야 한다.경험 이 있 는 사람 이 가 져 가면 몇 분 안 돼 서 해결 된다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.