diff --git a/DOC.md b/DOC.md
index 582337d65..42f8a0232 100644
--- a/DOC.md
+++ b/DOC.md
@@ -505,14 +505,135 @@ Jboot 的AOP功能,是使用了Google的Guice框架来完成的,通过AOP,
## @Bean
# RPC远程调用
-## Motan
-## @RpcService
+在Jboot中,RPC远程调用是通过新浪的motan、或阿里的dubbo来完成的。计划会支持 grpc和thrift等。
+
+
+### 使用步骤:
+#### 第一步:配置Jboot.properties文件,内容如下:
+
+```java
+#默认类型为 motan (支持:dubbo,计划支持 grpc 和 thrift)
+jboot.rpc.type = motan
+#发现服务类型为 consul ,支持zookeeper。
+jboot.rpc.registryType = consul
+jboot.rpc.registryAddress = 127.0.0.1:8500
+```
+
+#### 第二步:定义接口
+
+```java
+public interface HelloService {
+ public String hello(String name);
+}
+```
+
+#### 第三步:通过@JbootrpcService注解暴露服务到注册中心
+
+```java
+@JbootrpcService
+public class myHelloServiceImpl implements HelloService {
+ public String hello(String name){
+ System.out.println("hello" + name);
+ return "hello ok";
+ }
+}
+```
+
+#### 第四步:客户调用
+
+```java
+ HelloService service = Jboot.me().service(HelloService.class);
+ service.hello("michael");
+```
+如果是在Controller中,也可以通过 @JbootrpcService 注解来获取服务,代码如下:
+
+```java
+public class MyController extends JbootController{
+
+ @JbootrpcService
+ HelloService service ;
+
+ public void index(){
+ String text = service.hello();
+ renderText(text);
+ }
+
+}
+```
+
+#### 其他注意
+因为在配置文件中,配置的服务发现类型为consul,所以需要提前安装好consul。
+
+##### 下载consul
+https://www.consul.io
+
+##### 启动consul
+
+```java
+consul -agent dev
+```
+
+
# MQ消息队列
+Jboot 内置整个了MQ消息队列,使用MQ非常简单
+
+#### 第一步:配置jboot.properties文件,内容如下:
+```java
+#默认为redis (支持: redis,activemq,rabbitmq,hornetq,aliyunmq等 )
+jboot.mq.type = redis
+jboot.mq.redis.host = 127.0.0.1
+jboot.mq.redis.password =
+jboot.mq.redis.database =
+```
+
+#### 第二步:在服务器A中添加一个MQ消息监听器
+
+```java
+Jboot.me().getMq().addMessageListener(new JbootmqMessageListener(){
+ @Override
+ public void onMessage(String channel, Object obj) {
+ System.out.println(obj);
+ }
+}, channel);
+```
+
+#### 第三步:服务器B发送一个消息
+
+```java
+ Jboot.me().getMq().publish(yourObject, toChannel);
+```
+
+#### 注意:服务器A和服务器B在jboot.properties上应配置相同的内容。
+
## RedisMQ
## ActiveMQ
# Cache缓存
+Jboot中内置支持了ehcache、redis和 一个基于ehcache、redis研发的二级缓存ehredis,在使用Jboot缓存之前,先配置完成缓存的配置。
+
+### 使用步骤
+#### 第一步:配置jboot.properties文件,内容如下:
+
+```java
+#默认类型为ehcache ehcache (支持:ehcache,redis,ehredis)
+jboot.cache.type = redis
+jboot.cache.redis.host = 127.0.0.1
+jboot.cache.redis.password =
+jboot.cache.redis.database =
+```
+备注:ehredis 是一个基于ehcache和redis实现的二级缓存框架。
+
+#### 第二步:使用缓存
+
+```java
+Jboot.me().getCache().put("cacheName", "key", "value");
+```
+
+### 注意事项
+Jboot的分布式session是通过缓存实现的,所以如果要启用Jboot的分布式session,请在缓存中配置类型为redis或者ehredis。
+
+
## ehcache
## redis
## ehredis
@@ -528,6 +649,29 @@ Jboot 的AOP功能,是使用了Google的Guice框架来完成的,通过AOP,
## SPI扩展
## JbootEvnet事件机制
+为了解耦,Jboot内置了一个简单易用的事件系统,使用事件系统非常简单。
+
+#### 第一步,注册事件的监听器。
+
+```java
+@EventConfig(action = {“event1”,"event2"})
+public class MyEventListener implements JbootEventListener {
+
+ public void onMessage(JbootEvent event){
+ Object data = event.getData();
+ System.out.println("get event:"data);
+ }
+}
+```
+通过 @EventConfig 配置 让MyEventListener监听上 event1和event2两个事件。
+
+#### 第二步,在项目任何地方发生事件
+
+```java
+Jboot.sendEvent("event1", object)
+```
+
+
## 自定义序列化
@@ -594,344 +738,222 @@ MyConfigModel config = Jboot.config(MyConfigModel.class);
## 分布式session
-## shiro安全控制
## 代码生成器
+Jboot内置了一个简易的代码生成器,可以用来生成model层和Service层的基础代码,在生成代码之前,请先配置jboot.properties关于数据库相关的配置信息。
+### 使用步骤
-
-# maven dependency
-
+#### 第一步:配置数据源
```xml
-
- io.jboot
- jboot
- 1.0-beta3
-
-
-```
-# controller example
-
-
-
-new a controller
-
-```java
-@RequestMapping("/")
-public class MyController extend JbootController{
- public void index(){
- renderText("hello jboot");
- }
-}
-```
-
-start
-
-```java
-public class MyStarter{
- public static void main(String [] args){
- Jboot.run(args);
- }
-}
-```
-
-visit: http://127.0.0.1:8080
-
-
-# mq example
-config jboot.properties
-
-```java
-#type default redis (support: redis,activemq,rabbitmq,hornetq,aliyunmq )
-jboot.mq.type = redis
-jboot.mq.redis.host = 127.0.0.1
-jboot.mq.redis.password =
-jboot.mq.redis.database =
-```
-
-server a sendMqMessage
-
-```java
- Jboot.me().getMq().publish(yourObject, toChannel);
-```
-
-server b message listener
-
-```java
-Jboot.me().getMq().addMessageListener(new JbootmqMessageListener(){
- @Override
- public void onMessage(String channel, Object obj) {
- System.out.println(obj);
- }
-}, channel);
-```
-
-# rpc example
-config jboot.properties
-
-```java
-#type default motan (support:local,motan,grpc,thrift)
-jboot.rpc.type = motan
-jboot.rpc.requestTimeOut
-jboot.rpc.defaultPort
-jboot.rpc.defaultGroup
-jboot.rpc.defaultVersion
-jboot.rpc.registryType = consul
-jboot.rpc.registryName
-jboot.rpc.registryAddress = 127.0.0.1:8500
+jboot.datasource.type=mysql
+jboot.datasource.url=jdbc:mysql://127.0.0.1:3306/jbootdemo
+jboot.datasource.user=root
+jboot.datasource.password=your_password
```
-define interface
-
+#### 第二步:通过JbootModelGenerator生成model代码
```java
-public interface HelloService {
- public String hello(String name);
-}
-```
-
-server a export serviceImpl
+ public static void main(String[] args) {
+
+ //model 的包名
+ String modelPackage = "io.jboot.test";
+
+ JbootModelGenerator.run(modelPackage);
-```java
-@JbootrpcService
-public class myHelloServiceImpl implements HelloService {
- public String hello(String name){
- System.out.println("hello" + name);
- return "hello ok";
}
-}
```
-download consul and start (consul:https://www.consul.io/)
-
+#### 第三步:通过JbootServiceGenerator生成Service代码
```java
-consul -agent dev
-```
-
-server b call
-
-```java
- HelloService service = Jboot.me().service(HelloService.class);
- service.hello("michael");
-```
-
-or server b controller
-
-```java
-public class MyController extends bootController{
-
- @JbootrpcService
- HelloService service ;
-
- public void index(){
+ public static void main(String[] args) {
+
+ //生成service 的包名
+ String basePackage = "io.jboot.testservice";
+ //依赖model的包名
+ String modelPackage = "io.jboot.test";
- renderText("hello " + service.hello());
+ JbootServiceGenerator.run(basePackage, modelPackage);
+
}
-
-}
```
-# cache example
-config jboot.properties
+#### 其他
+当没在jboot.properties文件配置数据源的时候,可以通过如下代码来使用:
```java
-#type default ehcache (support:ehcache,redis,ehredis)
-jboot.cache.type = redis
-jboot.cache.redis.host =
-jboot.cache.redis.password =
-jboot.cache.redis.database =
-```
-备注:ehredis 是一个基于ehcache和redis实现的二级缓存框架。
+ public static void main(String[] args) {
-use cache
+ Jboot.setBootArg("jboot.datasource.url", "jdbc:mysql://127.0.0.1:3306/jbootdemo");
+ Jboot.setBootArg("jboot.datasource.user", "root");
-```java
-Jboot.me().getCache().put("cacheName", "key", "value");
-```
+ String basePackage = "io.jboot.codegen.service.test";
+ String modelPackage = "io.jboot.codegen.test.model";
+ JbootServiceGenerator.run(basePackage, modelPackage);
-# database access example
-config jboot.properties
+ }
-```java
-#type default mysql (support:mysql,oracle,db2...)
-jboot.datasource.type=
-jboot.datasource.url=
-jboot.datasource.user=
-jboot.datasource.password=
-jboot.datasource.driverClassName=
-jboot.datasource.connectionInitSql=
-jboot.datasource.cachePrepStmts=
-jboot.datasource.prepStmtCacheSize=
-jboot.datasource.prepStmtCacheSqlLimit=
```
-define model
-```java
-@Table(tableName = "user", primaryKey = "id")
-public class User extends JbootModel {
-
-}
-```
-dao query
-```java
-public class UserDao extends JbootDaoBase {
- public static find User DAO = new User();
-
- public User findById(String id){
- return DAO.findById(id);
- }
-
- public List findByNameAndAge(String name,int age){
-
- Columns columns = Columns.create()
- .like("name","%"+name+"%")
- .gt("age",age);
-
- return DAO.findListByColums(columns);
- }
-}
-```
-
-# event example
-send event
+# 项目构建
+在Jboot中已经内置了高性能服务器undertow,undertow的性能比tomcat高出很多(具体自行搜索:undertow vs tomcat),所以jboot构建和部署等不再需要tomcat。在Jboot构建的时候,在linux平台下,会生成jboot.sh 在windows平台下会生成jboot.bat脚本,直接执行该脚本即可。
-```java
-Jboot.me().sendEvent(actionStr, dataObj)
-```
+生成jboot.sh或者jboot.bat,依赖maven的appassembler插件,因此,你的maven配置文件pom.xml需要添加如下配置:
-event listener
+config pom.xml
-```java
-@EventConfig(action = {User.ACTION_ADD,User.ACTION_DELETE})
-public class MyEventListener implements JbootEventListener {
-
- public void onMessage(JbootEvent event){
-
- if(event.getAction.equals(User.ACTION_ADD)){
- System.out.println("new user add, user:"+event.getData);
- }else if(event.getAction.equals(User.ACTION_DELETE)){
- System.out.println("user deleted, user:"+event.getData);
- }
-
- }
-
-}
-```
+```xml
-# read config
-config jboot.properties
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 1.8
+ UTF-8
+
+ -parameters
+
+
+
+
+
+ org.codehaus.mojo
+ appassembler-maven-plugin
+ 1.10
+
+
+ ${project.build.directory}/app
+ libs
+ bin
+ webRoot
+ true
+ src/main/resources
+ flat
+ UTF-8
+ logs
+ tmp
+
+
+
+
+ io.jboot.Jboot
+ jboot
+
+ windows
+ unix
+
+
+
+
+
+
+
+ io.jboot.Jboot
+ jboot
+
+ jsw
+
+
+
+ jsw
+
+ linux-x86-32
+ linux-x86-64
+ macosx-universal-32
+ macosx-universal-64
+ windows-x86-32
+ windows-x86-64
+
+
+
+ configuration.directory.in.classpath.first
+ webRoot
+
+
+ wrapper.ping.timeout
+ 120
+
+
+ set.default.REPO_DIR
+ lib
+
+
+ wrapper.logfile
+ logs/wrapper.log
+
+
+
+
+
+
+
+
+
+
+```
+
+#### 进行maven构建
```java
-jboot.myconfig.user = aaa
-jboot.myconfig.password = bbb
+mvn package appassembler:assemble
```
-define config model
+构建完毕后,会在target目录下生成一个app文件夹,在app文件的bin目录下会有一个jboot脚本(或者jboot.bat)。
+#### 启动应用
```java
-@PropertieConfig(prefix = "jboot.myconfig")
-public class MyConfig {
-
- private String name;
- private String password;
-
- // getter and setter
-}
+cd yourProjectPath/target/app/bin
+./jboot
```
-get config model
+##### 在启动的时候添加上自己的配置信息
```java
- MyConfig config = Jboot.me().config(MyConfig.class);
- System.out.println(config.getName());
+cd yourProjectPath/target/app/bin
+./jboot --jboot.server.port=8080 --jboot.rpc.type=local
```
+##### 使用你自己的配置文件来代替 jboot.properties
-# code generator
```java
- public static void main(String[] args) {
-
- String modelPackage = "io.jboot.test";
- JbootModelGenerator.run(modelPackage);
-
- }
+cd yourProjectPath/target/app/bin
+./jboot --jboot.model=dev --jboot.server.port=8080
```
+上面的命令启动后,会使用 `jboot-dev.proerties` 文件来替代 `jboot.properties` 同时设置 jboot.server.port=8080(服务器端口号为8080)
-# build
-config pom.xml
+#### 后台程序
-```xml
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
-
- 1.8
-
-
-
- org.codehaus.mojo
- appassembler-maven-plugin
- 1.10
-
- ${project.build.directory}/app
- lib
- bin
- webRoot
- true
- src/main/resources
- flat
- UTF-8
- logs
- tmp
-
-
- io.jboot.Jboot
- jboot
-
- windows
- unix
-
-
-
-
-
-
-
-```
-
-maven build
+在以上文档中,如果通过如下代码进行构建的。
```java
mvn package appassembler:assemble
```
+构建会生成 app目录,及对应的jboot脚本,但是jboot在执行的时候是前台执行的,也就是必须打开一个窗口,当关闭这个窗口后,jboot内置的服务器undertow也会随之关闭了,在正式的环境里,我们是希望它能够以服务的方式在后台运行。
-# start app
-```java
-cd yourProjectPath/target/app/bin
-./jboot
-```
+那么,如果构建一个后台运行的程序呢?步骤如下:
-start app and change config
+##### 第一步:执行如下maven编译
```java
-cd yourProjectPath/target/app/bin
-./jboot --jboot.server.port=8080 --jboot.rpc.type=local
+mvn clean package appassembler:generate-daemons
```
-use your properties replace jboot.properties
+maven命令执行完毕后,会在target下生成如下文件夹 `/generated-resources/appassembler/jsw/jboot` , 文件中我们会找到bin目录,生成的后台脚本jboot(或jboot.bat)会存放在bin目录里。
+##### 第二步:启动应用
```java
-cd yourProjectPath/target/app/bin
-./jboot --jboot.model=dev --jboot.server.port=8080
+cd yourProjectPath/target/generated-resources/appassembler/jsw/jboot/bin
+./jboot
```
-use jboot-dev.proerties replace jboot.properties and set jboot.server.port=8080
+此时,启动的应用为后台程序了。
-# thanks
+# 鸣谢
rpc framework:
* motan(https://github.com/weibocom/motan)