2013-08-22 10 views
5

Wie kann ich Netty in Spring MVC konfigurieren. Wann und wo soll ich den Netty TCP Server starten? Soll ich netty beginnen, wenn der Frühling beginnt? Könnte mir jemand ein Beispiel wie die Spring-Konfigurations-XML-Datei oder etwas eles zeigen? Danke!Kombinieren Netty und Spring MVC

+0

Die bessere Frage nicht wie, aber macht es Sinn? Siehe http://stackoverflow.com/questions/18374277/combine-netty-and-spring-mvc – Maksym

Antwort

1

Erstellen Sie einfach eine Bohne mit start und stop Methoden, die den Netty Servers zum Starten und Herunterfahren verantwortlich sind und dann die Bohne im Zusammenhang mit dem entsprechenden init registrieren und Haken zerstört, zum Beispiel:

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

Or Alternativ können Sie @PostConstruct und @PreDestroy Annotationen verwenden, wenn Sie die XML-Konfiguration nicht verwenden möchten.

+0

Vielen Dank! Es hilft sehr! – lute

3

Es hängt wirklich davon ab, was Sie Netty für verwenden. Angenommen, Sie verwenden es als eingebetteten HTTP-Server, der auf einem separaten Port ausgeführt wird, können Sie es einfach in einer Spring-Bean initialisieren. Ich habe dies in der Vergangenheit erreichen einen nützlichen Netty/Atmosphere Wrapper Nettosphere genannt werden:

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

} 

Dies setzt voraus, die annotation-based configuration im Frühjahr, können Sie einfach das gleiche Ergebnis erzielen unter Verwendung von XML als in Jonathan's Antwort erklärt.

Natürlich bevorzugen Sie vielleicht Netty direkt zu verwenden, in diesem Fall gilt das gleiche Prinzip, aber Sie müssen in die Netty user guide ein wenig graben, um den Server korrekt zu laden.

+0

Es macht wirklich Sinn. Vielen Dank! – lute

1

Option 1 (Nur der Code):
Hier ist ein wirklich gutes Beispiel dafür, wie Netty Bootstrap mit einem Handler unterstützt Servlets (was wiederum den Job zu Spring MVC delegieren) https://github.com/rstoyanchev/netty-spring-mvc

Sie Es definieren ServletNettyHandler und Java-basiert Spring MVC configurer (DispatcherServletChannelInitializer) und die Testcontroller verwendet @Controller & @RequestMapping Anmerkungen wie immer in diesen Fällen.

Hinweise: Aktualisieren Sie Netty & Spring-Version des Beispiels, um es zu arbeiten.

Option 2 (Nur der Blog-Post):
ich einen Blog-Post gefunden habe, der den Prozess. http://www.hypersocket.com/content/?p=12

+1

Beide Links sind tot –

0

Eigentlich mit Feder 5 Sie eine Spring 5 Webflux Anwendung statt, es sieht aus wie eine robuste reaktive Alternative bringt konfigurieren . Die folgenden Zeilen (Config.start()) führen einen kleinen HTTP-Server parallel zur Hauptausführung mit einem Spring-Kontext aus.

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

Controller-Code:

@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. In diesem Beispiel wird nur Spring ohne Spring Boot verwendet, was genauso gut wie ein Side-Embedded-Webserver ist, aber Sie sollten Spring Boot für eine vollwertige Microservice-Entwicklung in Betracht ziehen.