树莓派智能家居:Spring集成netty

作者: lushitao 分类: 智能家居 发布时间: 2017-09-05 17:21

下面就进入到真正的开发阶段。

架构选用的是Spring+netty,为什么选择Spring来集成netty,而不是直接用netty打出来一个jar包,直接通过java –jar netty.jar命令来直接执行呢?固然通过java –jar的形式执行Java方法无须让jvm额外的去加载其他无用的jar包,能够让jvm最大程度的为我们自己的netty方法服务。但是,通过java –jar的方式执行的jar包,他只是一个用户进程可能会因为用户登出而导致该进程失效。即使在命令中加上nohup让其与用户Session无关,但因为进程优先级低,也会导致心跳包失效,甚至在内存不足时优先回收该进程的内存。而如果将netty集成到Spring中,Spring本来是一个轻量级的框架,对性能的影响较小,而且Spring会被加载到Tomcat中,Tomcat本来就是一个优秀的虚拟服务器,log输出,线程分配都非常合理,重要的是,Tomcat可以作为服务来运行,即使用户登录登出也丝毫不会影响Tomcat的运行。

另外,从我们需要的功能角度来讲,比如我们需要让树莓派新增一个闹钟,Spring可以执行定时任务,我们仅仅需要做一下相应的配置便可让Spring定时去执行一些任务。此外,还可以让Spring去调用本地的一些服务,这样一个Spring作为中转,既可以提供对外的网页链接,又可以调用本地应用,一举两得。

用Spring集成netty,首先还是要了解如何生成Spring项目。我的电脑采用的是Windows系统,开发使用的是eclipse,依赖管理采用的是maven(关于maven的搭建使用随后讲解),那么,首先新建一个我们的spring应用。

Eclipse中点击New–>Maven project–>next

点击next,填入工程名和package名,然后Finish。

此时,如果新建的工程报错,如下图所示。

此时需要在pom里新增关于servlet和spring相关的依赖。Pom新增如下:

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-beans</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-jdbc</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-tx</artifactId>

<version>${spring.version}</version>

</dependency>

 

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>servlet-api</artifactId>

<version>2.4</version>

</dependency>

等待maven更新完毕后,我们便可以进行package和Class的开发了。

首先以一个demo的形式,让Server和Client能够运行起来相互通信。那么,我们新建一个IOServer类,类的代码如下:

@Component

public class IOServer {

 

private static final int portNumber = 13013;

 

@PostConstruct

public void start(){

 

new Thread(new Runnable() {

@Override

public void run() {

 

EventLoopGroup bossGroup = new NioEventLoopGroup();

EventLoopGroup workerGroup = new NioEventLoopGroup();

try {

ServerBootstrap b = new ServerBootstrap();

b.group(bossGroup, workerGroup);

b.channel(NioServerSocketChannel.class);

b.childHandler(new IOServerInitializer());

ChannelFuture f = b.bind(portNumber).sync();

f.channel().closeFuture().sync();

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

bossGroup.shutdownGracefully();

workerGroup.shutdownGracefully();

}

}

}).start();

}

 

}

 

其中,Component表示Spring的包扫描机制,要求Spring对某些类进行扫描,当扫描到Component关键字时,自动创建这个类的实例,然后扫描是否有PostConstruct,这个关键字的意思是自动执行,即扫描到这个类之后,创建实例,并自动执行PostConstuct修饰的方法。

对于详细的代码我会以包的形式上传到我的服务器上,这里我想讲一下关于Spring的一些简单应用。

Spring工程,其实本质上还是一个Tomcat(Javaweb)工程,只不过在Javaweb的基础上新增了一些Spring的插件。程序启动的时候,首先去寻找web.xml,web.xml的作用可以认为是一个引导,现在我们在这里先了解一下web.xml的文件内容。

<servlet>

<servlet-name>InitEntry</servlet-name>

<servlet-class>lst.csu.common.Entry</servlet-class>

<load-on-startup>10</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>InitEntry</servlet-name>

<url-pattern>/init</url-pattern>

</servlet-mapping>

 

在文件中有这么几行配置,它的意思是,我首先定义一个servlet-name是InitEntry的Servlet工程,对应的URL是http://xxxx.com/init,而对于上面的三个配置表示,InitEntry这个servlet工程,对应的类是lst.csu.common.Entry,load-on-startup表示自动启动,10是一个优先级数字,越小优先级越高。

那么我们根据web.xml这个配置去寻找lst.csu.common.Entry,发现这个类的作用是这样的:

@Override

public void init() throws ServletException {

ContextUtil.getApplicationContext();

}

 

其实最终是为了让Servlet读取applicationContext.xml文件,这个文件是干嘛呢?仅仅是一个配置文件,告知Spring需要扫描哪些文件,需要预加载哪些类等等。

我在applicationContext.xml配置的是:

<context:component-scan base-package=”lst.csu.sockcenter” />

也就是要求Spring去扫描lst.csu.sockcenter这个包。那么问题就到了前面那个关于Commponent的解释了,Spring就会自动去扫描注解,从而自动执行某些程序。

代码太多了,我将demo工程以压缩包的形式上传到服务器,供大家下载。现在demo还没有增加具体的逻辑,所以很简单,仅仅用来展示如何进行新建Spring工程。所以稍安勿躁,硬件已经购回,下面树莓派智能家居项目会不断做下去。另外我代码写的不太好,也是自己在探索这些东西,所以大家见谅啦。

 

下载地址:树莓派netty集成demo

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注