buslogic中jetty和jersey的运用

buslogic主要依赖的是jersey,他提供了 JAX-RS的一个实现。 JAX-RS主要是定义了java restful框架的一种抽象实现。最主要的就是我们工程里restful用的那些annotation。所以说buslogic运用jersey主要是分为三部分,pom.xml, web.xml和java代码里的运用。

pom.xml

pom中比较重要的jersey包应该是jersey-core,jersey-server,jersey-servlet几个,我们还用了jersey-json等,这几个应该都不是很重要。另外我们的jersey是1.18,现在都是2.x了。有时间再去研究一下区别。现在只知道web.xml里有一个选项com.sun.jersey.spi.container.servlet.ServletContainer变了. 另外不知道有没有什么插件可以在intellij里面看pom中一个dependency被你的项目哪些地方所依赖

web.xml

web.xml 的东西直接在里面以注释的方式讲了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<context-param> <!--这个是jetty的参数,是在整个WEB项目内的上下文初始化参数,参考文献见1-->
<param-name>org.eclipse.jetty.servlet.SessionPath</param-name><!--这个设定了项目的html访问路径,见2-->
<param-value>/</param-value>
</context-param>
<context-param>
<param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
<param-value>3600</param-value>
</context-param>
<servlet>
<servlet-name>blacklist-rest</servlet-name>
<!--用servlet方式启动的话需要设置这个class,具体见3-->
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>dirAllowed</param-name>
<param-value>false</param-value>
</init-param>
<init-param><!--servlet的参数,这个参数设置了个fitler,而auth里面的AuthFilter类继承ContainerRequestFilter这个类。应该是在所有request来的时候都会经过authfilter进行一次过滤-->
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>cn.creditease.bdp.kg.auth.AuthFilter</param-value>
</init-param>
<init-param><!--packages这个指定了系统启动时扫描的包的路-->
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>
cn.creditease.bdp.kg.buslogic.blacklist,
cn.creditease.bdp.kg.auth,
cn.creditease.bdp.kg.buslogic.metrics
</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!--int类型,大于0会在启动时自动加载-->
</servlet>
<servlet-mapping><!--这个进一步定义了整个servlet的根路径-->
<servlet-name>blacklist-rest</servlet-name>
<url-pattern>/blacklist/*</url-pattern>
</servlet-mapping>
...
  1. Web.xml配置详解之context-param
  2. Chapter 10. Session Management
  3. RESTful Web Services Developer’s Guide
    • jetty的两种方式,一种是直接继承PackagesResourceConfig实现一个application,然后<param-name>javax.ws.rs.Application</param-name><param-value>类名</param-value>
    • 一种是<param-name>com.sun.jersey.config.property.packages</param-name><param-value>${pacakges}</param-value>让jetty自己寻找PackagesResourceConfig的实现(或者说寻找RESTFull resource class)

RESTFull resource class

我们的工程里每个api的jersey入口都是restful.java,这里有个疑问就是jersey是通过什么标示找到这个入口的,是不是类前面的@Path annotation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Path("/")
public class Restful {
final static Logger logger = LoggerFactory.getLogger(Restful.class);
@POST //request的类型
@Path("/write")//访问路径
@Produces("application/json;charset=UTF-8")
@Timed(name = "write")
public Response write(
@QueryParam("kg_source") String kgSource,//url参数
String json//body里的参数
) {
//do sth.
}

两篇参考:

request filter

auth是一个比较特殊的模块,它实现了一个filter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Provider
public class AuthFilter implements ContainerRequestFilter {
@Context
private HttpServletRequest servletRequest;
@Context
private HttpServletResponse servletResponse;
private static final Logger logger = LoggerFactory.getLogger(AuthFilter.class);
@Override
public ContainerRequest filter(ContainerRequest containerRequest) {
//do filter
}
}

这个主要是实现了一个containerRequestFilter的接口,重写了filter这个函数。其中
@Context的作用是获得一些系统环境信息,通过@Context可以获得以下信息:UriInfo、ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse和HttpHeaders等。

部署

我们使用的是最简单的部署方式,将war包放到webapps文件夹里,jetty会自动解析,并且假如你的war包名字是kg.war,则路径会被解析成http://host/kg/,就是说路径名和war包名是对应的。之后对应函数再看servlet-mapping和函数中的@Path。

当然也可以自己制定路径等信息,具体可以看这篇文章: Jetty:部署到Jetty

jetty本身是一个容器,和tomcat类似,buslogic应该是不用依赖他的(查了下buslogic里唯一用到jetty的地方是用了他的concurrentHashSet。。。)。只要在jersey等框架里配好web.xml就可以。buslogic的启动命令是nohup java -jar -Xms2048m -Xmx2048m -Dkgbuslogicdebug ../soft/jetty/start.jar 2>&1 > log &。而这个soft/jetty应该是直接下载jetty的源码接下就可以的。


本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:http://thousandhu.github.io/2016/04/20/buslogic中jetty和jersey的运用-md/