2013-08-22 53 views
5

如何在Spring MVC中配置Netty?何時何地啓動Netty tcp服務器?一旦Spring啓動,我應該啓動netty嗎?有人能給我看一個例子,比如Spring配置xml文件或者其他東西嗎? 謝謝!組合Netty和Spring MVC

<bean id="myNettyServer" class="x.y.z.MyNettyServer" init-method="start" destroy-method="shutdown"/> 

或者:

+0

更好的問題不是如何,但它有意義嗎?見http://stackoverflow.com/questions/18374277/combine-netty-and-spring-mvc – Maksym

回答

1

只是startstop方法,負責啓動和關閉的Netty服務器,然後在適當的init上下文註冊的bean和破壞掛鉤,例如創建一個bean如果您不想使用XML配置,則可以使用@PostConstruct@PreDestroy註釋。

+0

非常感謝!它有很大幫助! – lute

3

這真的取決於你使用Netty的。假設你使用它作爲一個在單獨的端口上運行的嵌入式HTTP服務器,你可以簡單地在Spring bean中初始化它。我已經使用名爲Nettosphere一個有用的Netty /大氣的包裝,在過去實現了這個:

@Service 
public class NettyServer implements ServletContextAware { 

    private ServletContext servletContext; 

    private Nettosphere server; 

    @Autowired 
    private MyStatusHandler statusHandler; 

    @PostConstruct 
    public void initialiseNettyServer() { 
      String rootPath = servletContext.getContextPath() + "/api"; 

      server = new Nettosphere.Builder().config(
        new Config.Builder() 
          .host(SERVER_HOST) 
          .port(SERVER_PORT) 
          .resource(rootPath + "/status", statusHandler) 
          .build()) 
        .build(); 
      server.start(); 
    } 

    @PreDestroy 
    public void shutdownNettyServer() { 
      server.stop(); 
    } 

} 

這是假設在春天的annotation-based configuration,可以輕鬆實現使用XML相同的結果Jonathan's答案解釋。

當然,您可能更喜歡直接使用Netty,在這種情況下,同樣的原則適用,但您需要深入研究Netty user guide以便正確引導服務器。

+0

這真的很有道理。謝謝! – lute

1

選項1(只需代碼):
這裏展示瞭如何引導Netty的與控制器支持的Servlet(這反過來將委派工作了Spring MVC)https://github.com/rstoyanchev/netty-spring-mvc

有你一個很好的例子定義ServletNettyHandler加上基於Java的Spring MVC的配置者(DispatcherServletChannelInitializer),以及的TestController採用@Controller & @RequestMapping註釋,因爲它總是在這些情況下。

備註:考慮更新Netty &該示例的春季版本以使其工作。

選項2(就在博客文章):
我發現博客中描述的過程。 http://www.hypersocket.com/content/?p=12

+1

這兩個鏈接都已死亡 –

0

其實與Spring 5您可以配置一個Spring 5 Webflux應用程序,而不是,它看起來像一個強大的替代反應。以下行(Config.start())與Spring上下文一起運行與主執行並行的小型HTTP服務器。

@Configuration 
public class Config extends DelegatingWebFluxConfiguration{ 
    @Bean 
    String test(){ 
     return "Hello WOrLd"; 
    } 

    @Bean 
    AdminController controller(){ 
     return new AdminController(); 
    } 

    public static void start() { 
     AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class); 
     HttpHandler handler = WebHttpHandlerBuilder.applicationContext(applicationContext).build(); 
     ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler); 
     HttpServer.create("0.0.0.0", 8082).newHandler(adapter).subscribe(); 
    } 
} 

控制器代碼:

@RestController 
public class AdminController { 
    @Autowired 
    String text; 

    @GetMapping(path = "/commands") 
    Mono<String> commands(){ 
     return Mono.just(text); 
    } 
} 

的build.gradle

compile 'org.springframework:spring-context:5.0.2.RELEASE' 
compile 'org.springframework:spring-web:5.0.2.RELEASE' 
compile 'org.springframework:spring-webflux:5.0.2.RELEASE' 
compile 'io.projectreactor.ipc:reactor-netty:0.7.2.RELEASE' 

P.S.這個例子只使用沒有Spring Boot的Spring,它和嵌入式Web服務器一樣好,但是你應該考慮使用Spring Boot來開發一個完整的微服務。