如何在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"/>
或者:
如何在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"/>
或者:
只是start
和stop
方法,負責啓動和關閉的Netty服務器,然後在適當的init上下文註冊的bean和破壞掛鉤,例如創建一個bean如果您不想使用XML配置,則可以使用@PostConstruct
和@PreDestroy
註釋。
非常感謝!它有很大幫助! – lute
這真的取決於你使用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以便正確引導服務器。
這真的很有道理。謝謝! – lute
選項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
這兩個鏈接都已死亡 –
看看帶來Netty.io到Spring框架實現了Servlet API的一個子集Cruzeira項目 https://github.com/fabiofalci/cruzeira
其實與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來開發一個完整的微服務。
更好的問題不是如何,但它有意義嗎?見http://stackoverflow.com/questions/18374277/combine-netty-and-spring-mvc – Maksym