2013-08-22 19 views
5

Jak skonfigurować Netty w Spring MVC. Kiedy i gdzie powinienem uruchomić serwer Netty tcp? Czy powinienem zainicjować netty po rozpoczęciu Wiosny? Czy ktoś może pokazać mi przykład, taki jak plik xml konfiguracji Spring lub coś innego? Dzięki!Połączyć Netty i Spring MVC

+0

Lepsze pytanie nie jak, ale czy ma sens? Zobacz http://stackoverflow.com/questions/18374277/combine-netty-and-spring-mvc – Maksym

Odpowiedz

1

Wystarczy utworzyć Bean z start i stop metod, które są odpowiedzialne za uruchamianie i wyłączanie serwera Netty a następnie zarejestrować fasoli w kontekście z właściwymi startowych i zniszczyć haczyki, np

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

Or alternatywnie użyj adnotacji @PostConstruct i @PreDestroy, jeśli nie chcesz używać konfiguracji XML.

+0

Wielkie dzięki! To bardzo pomaga! – lute

3

To naprawdę zależy od tego, do czego używasz Netty. Zakładając, że używasz go jako wbudowanego serwera HTTP działającego na oddzielnym porcie, możesz go po prostu zainicjować w komponencie Spring. Mam osiągnięte w przeszłości za pomocą przydatnych opakowanie Netty/Atmosfera nazwie Nettosphere:

@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(); 
    } 

} 

ten zakłada annotation-based configuration wiosną, można łatwo osiągnąć ten sam efekt przy użyciu języka XML, jak wyjaśniono w Jonathan's odpowiedź.

Oczywiście, możesz preferować użycie Netty bezpośrednio, w takim przypadku ta sama zasada ma zastosowanie, ale będziesz musiał zagłębić się w , aby poprawnie załadować serwer.

+0

To naprawdę ma sens. Dzięki! – lute

1

Wariant 1 (tylko kod):
Oto naprawdę dobry przykład pokazujący jak bootstrap Netty z obsługi wspieranie Servlets (który z kolei przekaże zadanie do wiosennego MVC) https://github.com/rstoyanchev/netty-spring-mvc

Tam określenie ServletNettyHandler Plus Java oparte configurer Wiosna MCV (DispatcherServletChannelInitializer), a TestController zastosowania @Controller & @RequestMapping adnotacje, jak zawsze w takich przypadkach.

Uwagi: Należy rozważyć aktualizację Netty & Wiosenna wersja przykładu, aby działała.

Opcja 2 (Tylko blogu):
Znalazłem blogu opisującego proces. http://www.hypersocket.com/content/?p=12

+1

Oba dowiązania są martwe –

0

Właściwie ze sprężyny 5 można skonfigurować aplikację Spring 5 Webflux zamiast, wygląda solidnej alternatywy biernej . Poniższe linie (Config.start()) uruchamiają mały serwer HTTP równolegle z głównym wykonaniem z kontekstem Spring.

@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(); 
    } 
} 

kod kontrolera:

@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' 

PS: w tym przykładzie używa tylko Spring bez Spring Boot, który jest równie dobry jak wbudowany serwer WWW, ale powinieneś rozważyć użycie Spring Boot do stworzenia pełnowartościowego mikroserwisu.