欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何在Netty中注解使用Service或者Mapper

 更新時間:2022年02月14日 17:03:31   作者:sinat_35938012  
這篇文章主要介紹了如何在Netty中注解使用Service或者Mapper,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Netty注解使用Service或Mapper

SpringBoot搭配Netty使用,在Handler中注解使用Service/Mapper 一直 為null。起初使用 SpringBoot啟動類繼承ApplicationContextAware,再寫一個靜態(tài)方法獲取Bean來解決。

放在服務器上跑了幾個小時就出現(xiàn)了問題,好像是該方案造成的。

另辟蹊徑,再看網(wǎng)上給出的答案,因為 Handler 是 new出來的,不被Spring管理,所以注解根本就沒有什么作用。

思前想后,(有BUG,下文修正解決:覺得可以給Handler添加@Component 注解交給Spring 管理,再通過構(gòu)造方法把 Handler 傳遞給Server。結(jié)構(gòu)代碼):

Handler

@Component
public class OBDHandler extends ChannelInboundHandlerAdapter {
?
?? ?private final Logger logger = LoggerFactory.getLogger(getClass());
?? ?
?? ?@Autowired
?? ?private OBDMapper mOBDMapper;
}

Server

public class OBDServer {?
?? ?private Logger log = LoggerFactory.getLogger(getClass());
?? ?private OBDHandler obdHandler;
?? ?private int port;?
?? ?public OBDServer(int port,OBDHandler obdHandler) {
?? ??? ?this.port = port;
?? ??? ?this.obdHandler = obdHandler;
?? ?}
?
?? ?private void bind() throws Exception {
?? ??? ?EventLoopGroup group = new NioEventLoopGroup();
?? ??? ?ServerBootstrap serverBootstrap = new ServerBootstrap();
?? ??? ?serverBootstrap.group(group)//
?? ??? ?.channel(NioServerSocketChannel.class) //
?? ??? ?.childHandler(new ChannelInitializer<SocketChannel>() { //
?? ??? ??? ?@Override
?? ??? ??? ?public void initChannel(SocketChannel ch) throws Exception {
?? ??? ??? ??? ?ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024*1024,0,4));
?? ??? ??? ??? ?ch.pipeline().addLast(obdHandler);
?? ??? ??? ?}
?? ??? ?});
? ? }
}

創(chuàng)建Server

@Configuration
public class NettyConfig {?? ?
?? ?@Autowired
?? ?private OBDHandler obdHandler;
?? ?
?? ?@Bean
?? ?public OBDServer obdServer(){
?? ??? ?OBDServer obdServer = new OBDServer(7788,obdHandler);
?? ??? ?obdServer.startServer();
?? ??? ?return obdServer;
?? ?}
}

二次修訂

并發(fā)需要創(chuàng)建多個Handler,而被Spring托管的單例Handler會造成以下錯誤:

is not a @Sharable handler, so can't be added or removed multiple times.

最終通過在Server中注入 Service/Mapper,再通過Handler構(gòu)造傳遞:

public class OBDServer {?
? ? @Autowired
? ? private OBDMapper mOBDMapper;?? ?
?? ?public OBDServer(int port) {
?? ??? ?this.port = port;
?? ?}
?
?? ?private void bind() throws Exception {
?? ??? ?EventLoopGroup group = new NioEventLoopGroup();
?? ??? ?ServerBootstrap serverBootstrap = new ServerBootstrap();
?? ??? ?serverBootstrap.group(group)//
?? ??? ?.channel(NioServerSocketChannel.class) //
?? ??? ?.childHandler(new ChannelInitializer<SocketChannel>() { //
?? ??? ??? ?@Override
?? ??? ??? ?public void initChannel(SocketChannel ch) throws Exception {
?? ??? ??? ??? ?ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024*1024,0,4));
?? ??? ??? ??? ?ch.pipeline().addLast(new OBDHandler(mOBDMapper));
?? ??? ??? ?}
?? ??? ?});
? ? }
}

Netty handler注入service為空

注入方式

@Slf4j
@Component
public class BootNettyChannelInboundHandlerAdapter extends ChannelInboundHandlerAdapter {
? ?public static BootNettyChannelInboundHandlerAdapter?
? ?bootNettyChannelInboundHandlerAdapter;
? ? //1.正常注入[記得主類也需要使用@Component注解]
? ? @Autowired
? ? private DeviceUpService deviceUpService;
? ? //2.初始化構(gòu)造方法一定要有
? ? public BootNettyChannelInboundHandlerAdapter() {
?
? ? }
? ? //3.容器初始化的時候進行執(zhí)行-這里是重點
? ? @PostConstruct
? ? public void init() {
? ? ? ? bootNettyChannelInboundHandlerAdapter = this;
? ? ? ? bootNettyChannelInboundHandlerAdapter.deviceUpService = this.deviceUpService;
? ? }
}

完成以上步驟后通過

bootNettyChannelInboundHandlerAdapter.deviceUpService

調(diào)用service類即可

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot RestTemplate提交表單數(shù)據(jù)的三種方法

    Spring Boot RestTemplate提交表單數(shù)據(jù)的三種方法

    本篇文章主要介紹了Spring Boot RestTemplate提交表單數(shù)據(jù)的三種方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java cglib動態(tài)代理原理分析

    Java cglib動態(tài)代理原理分析

    這篇文章主要介紹了Java cglib動態(tài)代理的相關(guān)資料,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-05-05
  • 手把手帶你粗略了解Java--類和對象

    手把手帶你粗略了解Java--類和對象

    這篇文章主要給大家介紹了關(guān)于java中類和對象的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • springbean的八種加載方式匯總

    springbean的八種加載方式匯總

    這篇文章主要介紹了springbean的八種加載方式,一種是XML方式聲明bean,使用@Component及其衍生注解@Controller?、@Service、@Repository定義bean,還有其他方法,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • java中List對象列表實現(xiàn)去重或取出及排序的方法

    java中List對象列表實現(xiàn)去重或取出及排序的方法

    這篇文章主要介紹了關(guān)于java中List對象列表實現(xiàn)去重或取出以及排序的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。
    2017-08-08
  • Java漢字轉(zhuǎn)拼音工具類完整代碼實例

    Java漢字轉(zhuǎn)拼音工具類完整代碼實例

    這篇文章主要介紹了java漢字轉(zhuǎn)拼音工具類完整代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 詳解JavaEE 使用 Redis 數(shù)據(jù)庫進行內(nèi)容緩存和高訪問負載

    詳解JavaEE 使用 Redis 數(shù)據(jù)庫進行內(nèi)容緩存和高訪問負載

    本篇文章主要介紹了JavaEE 使用 Redis 數(shù)據(jù)庫進行內(nèi)容緩存和高訪問負載,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • java http token請求代碼實例

    java http token請求代碼實例

    這篇文章主要介紹了java http token請求,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • java 多線程饑餓現(xiàn)象的問題解決方法

    java 多線程饑餓現(xiàn)象的問題解決方法

    這篇文章主要介紹了java 多線程饑餓現(xiàn)象的問題解決方法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • SpringBoot框架如何操作Excel和PDF

    SpringBoot框架如何操作Excel和PDF

    Excel和PDF都是常見的辦公文件類型,在實際需求中有著較多的應用,excel經(jīng)常用來處理數(shù)據(jù),PDF文件格式可以將文字、字型、格式、顏色及獨立于設備和分辨率的圖形圖像等封裝在一個文件中,本文就講述下SpringBoot框架如何操作這兩種類型的文件
    2021-06-06

最新評論