您的位置:首页 > 编程语言 > Java开发

<Netty>(二十七)(项目篇)Netty项目之客户端代码(maven+springboot+自定义注解+分库分表+Netty)

2018-03-21 20:33 537 查看

 

http://localhost:8001/sender?count=10浏览器的请求网址是这个

一,数据源配置

1.1,pom.xml配置

1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2   <modelVersion>4.0.0</modelVersion>
3   <groupId>bhz.uts</groupId>
4   <artifactId>uts-sender</artifactId>
5   <version>0.0.1-SNAPSHOT</version>
6
7     <parent>
8         <groupId>org.springframework.boot</groupId>
9         <artifactId>spring-boot-starter-parent</artifactId>
10         <version>1.5.6.RELEASE</version>
11         <relativePath/> <!-- lookup parent from repository -->
12     </parent>
13
14     <properties>
15         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
16         <java.version>1.8</java.version>
17         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18         <java.version>1.8</java.version>
19         <commons-fileupload.version>1.2.2</commons-fileupload.version>
20         <commons-lang3.version>3.3.1</commons-lang3.version>
21         <commons-io.version>2.4</commons-io.version>
22         <commons-collections.version>3.2.2</commons-collections.version>
23         <fastjson.version>1.1.26</fastjson.version>
24         <mybatis.version>3.4.1</mybatis.version>
25         <mybatis-spring.version>1.3.0</mybatis-spring.version>
26         <druid.version>1.0.24</druid.version>
27         <activiti.version>5.21.0</activiti.version>
28         <cxf.version>3.0.0</cxf.version>
29         <cxf-rt.version>3.1.6</cxf-rt.version>
30         <oracle.version>7</oracle.version>
31         <fasterxml.uuid.version>3.1.4</fasterxml.uuid.version>
32         <github.miemiedev.version>1.2.17</github.miemiedev.version>
33         <common.codec.version>1.10</common.codec.version>
34         <servlet-api.version>3.1.0</servlet-api.version>
35         <kaptcha.version>2.3.2</kaptcha.version>
36         <org.codehaus.jackson.version>1.9.13</org.codehaus.jackson.version>
37         <poi-ooxml.version>3.9</poi-ooxml.version>
38         <commons-beanutils.version>1.9.3</commons-beanutils.version>
39         <pinyin4j.version>2.5.1</pinyin4j.version>
40     </properties>
41
42     <dependencies>
43          <!-- 添加SpringMvc、Web[TOMCAT] jar provided排除tomcat, 使用独立容器运行(非内嵌,当) -->
44         <dependency>
45             <groupId>org.springframework.boot</groupId>
46             <artifactId>spring-boot-starter-web</artifactId>
47         </dependency>
48         <dependency>
49             <groupId>org.springframework.boot</groupId>
50             <artifactId>spring-boot-starter-test</artifactId>
51             <scope>test</scope>
52         </dependency>
53         <dependency>
54             <groupId>org.springframework.boot</groupId>
55             <artifactId>spring-boot-starter-aop</artifactId>
56         </dependency>
57         <dependency>
58             <groupId>org.springframework.boot</groupId>
59             <artifactId>spring-boot-autoconfigure</artifactId>
60         </dependency>
61         <dependency>
62             <groupId>commons-fileupload</groupId>
63             <artifactId>commons-fileupload</artifactId>
64             <version>${commons-fileupload.version}</version>
65         </dependency>
66         <dependency>
67             <groupId>org.apache.commons</groupId>
68             <artifactId>commons-lang3</artifactId>
69             <version>${commons-lang3.version}</version>
70         </dependency>
71         <dependency>
72             <groupId>commons-io</groupId>
73             <artifactId>commons-io</artifactId>
74             <version>${commons-io.version}</version>
75         </dependency>
76         <dependency>
77             <groupId>commons-collections</groupId>
78             <artifactId>commons-collections</artifactId>
79             <version>${commons-collections.version}</version>
80         </dependency>
81         <dependency>
82             <groupId>commons-codec</groupId>
83             <artifactId>commons-codec</artifactId>
84             <version>${common.codec.version}</version>
85         </dependency>
86         <dependency>
87             <groupId>commons-beanutils</groupId>
88             <artifactId>commons-beanutils</artifactId>
89             <version>${commons-beanutils.version}</version>
90         </dependency>
91         <dependency>
92             <groupId>com.alibaba</groupId>
93             <artifactId>fastjson</artifactId>
94             <version>${fastjson.version}</version>
95         </dependency>
96         <!--对json格式的支持 -->
97         <dependency>
98             <groupId>org.codehaus.jackson</groupId>
99             <artifactId>jackson-mapper-asl</artifactId>
100             <version>${org.codehaus.jackson.version}</version>
101         </dependency>
102         <dependency>
103             <groupId>com.fasterxml.jackson.core</groupId>
104             <artifactId>jackson-databind</artifactId>
105         </dependency>
106         <dependency>
107             <groupId>com.fasterxml.uuid</groupId>
108             <artifactId>java-uuid-generator</artifactId>
109             <version>${fasterxml.uuid.version}</version>
110         </dependency>
111         <!-- 添加JDBC jar -->
112         <dependency>
113             <groupId>org.springframework.boot</groupId>
114             <artifactId>spring-boot-starter-jdbc</artifactId>
115         </dependency>
116         <dependency>
117           <groupId>org.mybatis.spring.boot</groupId>
118           <artifactId>mybatis-spring-boot-starter</artifactId>
119           <version>1.1.1</version>
120         </dependency>
121         <dependency>
122           <groupId>tk.mybatis</groupId>
123           <artifactId>mapper-spring-boot-starter</artifactId>
124           <version>1.1.0</version>
125         </dependency>
126         <dependency>
127             <groupId>com.alibaba</groupId>
128             <artifactId>druid</artifactId>
129             <version>${druid.version}</version>
130         </dependency>
131         <dependency>
132             <groupId>mysql</groupId>
133             <artifactId>mysql-connector-java</artifactId>
134         </dependency>
135         <dependency>
136             <groupId>com.github.pagehelper</groupId>
137             <artifactId>pagehelper-spring-boot-starter</artifactId>
138             <version>1.1.0</version>
139             <exclusions>
140                 <exclusion>
141                     <artifactId>mybatis-spring-boot-starter</artifactId>
142                     <groupId>org.mybatis.spring.boot</groupId>
143                 </exclusion>
144             </exclusions>
145         </dependency>
146         <!-- netty -->
147         <dependency>
148             <groupId>io.netty</groupId>
149             <artifactId>netty-all</artifactId>
150             <version>4.1.12.Final</version>
151         </dependency>
152         <!-- 序列化框架marshalling -->
153         <dependency>
154             <groupId>org.jboss.marshalling</groupId>
155             <artifactId>jboss-marshalling</artifactId>
156             <version>1.3.0.CR9</version>
157         </dependency>
158            <dependency>
159             <groupId>org.jboss.marshalling</groupId>
160             <artifactId>jboss-marshalling-serial</artifactId>
161             <version>1.3.0.CR9</version>
162         </dependency>
163         <!-- netty end -->
164     </dependencies>
165
166      <build>
167         <finalName>uts-sender</finalName>
168         <!-- 打包时包含properties、xml -->
169         <resources>
170              <resource>
171                 <directory>src/main/java</directory>
172                 <includes>
173                     <include>**/*.properties</include>
174                     <include>**/*.xml</include>
175                 </includes>
176                 <!-- 是否替换资源中的属性-->
177                 <filtering>true</filtering>
178             </resource>
179             <resource>
180                 <directory>src/main/resources</directory>
181             </resource>
182         </resources>
183            <plugins>
184             <plugin>
185                 <groupId>org.apache.maven.plugins</groupId>
186                 <artifactId>maven-war-plugin</artifactId>
187             </plugin>
188             <!-- 解解决maven update project 后版本降低为1.5的bug -->
189             <plugin>
190                 <groupId>org.apache.maven.plugins</groupId>
191                 <artifactId>maven-compiler-plugin</artifactId>
192                 <configuration>
193                     <source>1.8</source>
194                     <target>1.8</target>
195                 </configuration>
196             </plugin>
197             <!-- 单元测试 -->
198             <plugin>
199                 <groupId>org.apache.maven.plugins</groupId>
200                 <artifactId>maven-surefire-plugin</artifactId>
201                 <configuration>
202                     <skip>true</skip>
203                     <includes>
204                         <include>**/*Test*.java</include>
205                     </includes>
206                     <testFailureIgnore>true</testFailureIgnore>
207                 </configuration>
208             </plugin>
209             <plugin>
210                 <groupId>org.apache.maven.plugins</groupId>
211                 <artifactId>maven-source-plugin</artifactId>
212                 <executions>
213                     <!-- 绑定到特定的生命周期之后,运行maven-source-pluin 运行目标为jar-no-fork -->
214                     <execution>
215                         <phase>package</phase>
216                         <goals>
217                             <goal>jar-no-fork</goal>
218                         </goals>
219                     </execution>
220                 </executions>
221             </plugin>
222         </plugins>
223       </build>
224
225 </project>

 

 

1.2,application.yml配置

1 server:
2   context-path: /
3   port: 8001
4
5
6 transfer:
7   host: 127.0.0.1
8   port: 8765
9
10 ## Spring配置:
11 spring:
12   http:
13     encoding:
14       charset: UTF-8
15   jackson:
16     date-format: yyyy-MM-dd HH:mm:ss
17     time-zone: GMT+8
18     default-property-inclusion: NON_NULL
19   ##DATASOURCE CONFIGURATION -- see druid.yml
20   datasource:
21     type: com.alibaba.druid.pool.DruidDataSource
22     url: jdbc:mysql://localhost:3306/uts-sender?characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useUnicode=true
23     driver-class-name: com.mysql.jdbc.Driver
24     username: root
25     password: root
26
27
28 mybatis:
29     type-aliases-package: bhz.uts
30     mapper-locations: classpath:bhz/uts/mapping/*.xml
31
32 logging:
33     level:
34         tk.mybatis: TRACE
35
36
37 pagehelper:
38     helperDialect: mysql
39     reasonable: true
40     supportMethodsArguments: true
41     params: count=countSql
42
43
44
45

 

 

 

druid.properties

1 ##下面为连接池的补充设置,应用到上面所有数据源中
2 #初始化大小,最小,最大
3 druid.initialSize=50
4 druid.minIdle=10
5 druid.maxIdle=10
6 druid.maxActive=500
7 #配置获取连接等待超时的时间
8 druid.maxWait=60000
9 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
10 druid.timeBetweenEvictionRunsMillis=60000
11 #配置一个连接在池中最小生存的时间,单位是毫秒
12 druid.minEvictableIdleTimeMillis=300000
13 druid.validationQuery=SELECT 1 FROM DUAL
14 druid.testWhileIdle=true
15 druid.testOnBorrow=false
16 druid.testOnReturn=false
17 #打开PSCache,并且指定每个连接上PSCache的大小
18 druid.poolPreparedStatements=true
19 druid.maxPoolPreparedStatementPerConnectionSize=20
20 #配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
21 druid.filters=stat,wall,log4j
22 #通过connectProperties属性来打开mergeSql功能;慢SQL记录
23 druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
24 #合并多个DruidDataSource的监控数据
25 druid.useGlobalDataSourceStat=true

 

 

1.3,数据库sql语句

1 /*==============================================================*/
2 /* DBMS name:      MySQL 5.0                                    */
3 /* Created on:     2017/9/1 21:40:47                            */
4 /*==============================================================*/
5
6
7 drop table if exists TRADE_DETAIL;
8
9 /*==============================================================*/
10 /* Table: TRADE_DETAIL                                          */
11 /*==============================================================*/
12 create table TRADE_DETAIL
13 (
14    ID                   varchar(128) not null,
15    SERIALNO             varchar(128) not null,
16    TRADE_DATE           timestamp not null,
17    DEDBIT_AMOUNT        numeric(20,2) not null,
18    CREDIT_AMOUNT        numeric(20,2) not null,
19    BUSINESS_TYPE        varchar(40) not null,
20    BALANCE              numeric(20,2) not null,
21    OPP_ACCOUNT_NAME     varchar(40) not null,
22    OPP_ACCOUNT_NO       varchar(40) not null,
23    ACCOUNT_NAME          varchar(40) not null,
24    ACCOUNT_NO           varchar(40) not null,
25    DIGEST               varchar(400),
26    STATUS               varchar(1) not null,
27    CREATE_BY            varchar(40) not null,
28    CREATE_TIME          timestamp not null,
29    UPDATE_BY            varchar(40) not null,
30    UPDATE_TIME          timestamp not null,
31    primary key (ID)
32 );

 

 

 

 

1.4,BaseMapper.java(基础扫描类)

1 package bhz.uts.config.database;
2
3
4 import tk.mybatis.mapper.common.Mapper;
5 import tk.mybatis.mapper.common.MySqlMapper;
6 /**
7  * <B>系统名称:</B><BR>
8  * <B>模块名称:</B>base-sys<BR>
9  * <B>中文类名:</B>BaseMapper<BR>
10  * <B>概要说明:</B>基础数据库服务<BR>
11  * @author bhz
12  * @since 2017年2月8日 下午2:42:49
13  */
14 public interface BaseMapper<T> extends Mapper<T>, MySqlMapper<T> {
15
16 }

 

 

1.5,DruidDataSourceSettings.java(数据源注入类,这个类只负责把配置文件中的数据源的东西加载到相应的属性中来)

1 package bhz.uts.config.database;
2
3 import org.springframework.beans.factory.annotation.Value;
4 import org.springframework.boot.context.properties.ConfigurationProperties;
5 import org.springframework.context.annotation.Bean;
6 import org.springframework.context.annotation.PropertySource;
7 import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
8 import org.springframework.stereotype.Component;
9
10 @Component
11 @ConfigurationProperties(prefix="spring.datasource")
12 @PropertySource("classpath:druid.properties")
13 public class DruidDataSourceSettings {
14
15     private String driverClassName;
16     private String url;
17     private String username;
18     private String password;
19
20     @Value("${druid.initialSize}")
21     private int initialSize;
22
23     @Value("${druid.minIdle}")
24     private int minIdle;
25
26     @Value("${druid.maxIdle}")
27     private int maxIdle;
28
29     @Value("${druid.maxActive}")
30     private int maxActive;
31
32     @Value("${druid.timeBetweenEvictionRunsMillis}")
33     private long timeBetweenEvictionRunsMillis;
34
35     @Value("${druid.minEvictableIdleTimeMillis}")
36     private long minEvictableIdleTimeMillis;
37
38     @Value("${druid.validationQuery}")
39     private String validationQuery;
40
41     @Value("${druid.testWhileIdle}")
42     private boolean testWhileIdle;
43
44     @Value("${druid.testOnBorrow}")
45     private boolean testOnBorrow;
46
47     @Value("${druid.testOnReturn}")
48     private boolean testOnReturn;
49
50     @Value("${druid.poolPreparedStatements}")
51     private boolean poolPreparedStatements;
52
53     @Value("${druid.maxPoolPreparedStatementPerConnectionSize}")
54     private int maxPoolPreparedStatementPerConnectionSize;
55
56     @Value("${druid.filters}")
57     private String filters;
58
59     @Value("${druid.connectionProperties}")
60     private String connectionProperties;
61
62     @Bean
63     public static PropertySourcesPlaceholderConfigurer properdtyConfigure(){
64         return new PropertySourcesPlaceholderConfigurer();
65     }
66
67     public String getDriverClassName() {
68         return driverClassName;
69     }
70     public void setDriverClassName(String driverClassName) {
71         this.driverClassName = driverClassName;
72     }
73     public String getUrl() {
74         return url;
75     }
76     public void setUrl(String url) {
77         this.url = url;
78     }
79     public String getUsername() {
80         return username;
81     }
82     public void setUsername(String username) {
83         this.username = username;
84     }
85     public String getPassword() {
86         return password;
87     }
88     public void setPassword(String password) {
89         this.password = password;
90     }
91     public int getInitialSize() {
92         return initialSize;
93     }
94     public void setInitialSize(int initialSize) {
95         this.initialSize = initialSize;
96     }
97     public int getMinIdle() {
98         return minIdle;
99     }
100     public void setMinIdle(int minIdle) {
101         this.minIdle = minIdle;
102     }
103     public int getMaxIdle() {
104         return maxIdle;
105     }
106     public void setMaxIdle(int maxIdle) {
107         this.maxIdle = maxIdle;
108     }
109     public int getMaxActive() {
110         return maxActive;
111     }
112     public void setMaxActive(int maxActive) {
113         this.maxActive = maxActive;
114     }
115     public long getTimeBetweenEvictionRunsMillis() {
116         return timeBetweenEvictionRunsMillis;
117     }
118     public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
119         this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
120     }
121     public long getMinEvictableIdleTimeMillis() {
122         return minEvictableIdleTimeMillis;
123     }
124     public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
125         this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
126     }
127     public String getValidationQuery() {
128         return validationQuery;
129     }
130     public void setValidationQuery(String validationQuery) {
131         this.validationQuery = validationQuery;
132     }
133     public boolean isTestWhileIdle() {
134         return testWhileIdle;
135     }
136     public void setTestWhileIdle(boolean testWhileIdle) {
137         this.testWhileIdle = testWhileIdle;
138     }
139     public boolean isTestOnBorrow() {
140         return testOnBorrow;
141     }
142     public void setTestOnBorrow(boolean testOnBorrow) {
143         this.testOnBorrow = testOnBorrow;
144     }
145     public boolean isTestOnReturn() {
146         return testOnReturn;
147     }
148     public void setTestOnReturn(boolean testOnReturn) {
149         this.testOnReturn = testOnReturn;
150     }
151     public boolean isPoolPreparedStatements() {
152         return poolPreparedStatements;
153     }
154     public void setPoolPreparedStatements(boolean poolPreparedStatements) {
155         this.poolPreparedStatements = poolPreparedStatements;
156     }
157     public int getMaxPoolPreparedStatementPerConnectionSize() {
158         return maxPoolPreparedStatementPerConnectionSize;
159     }
160     public void setMaxPoolPreparedStatementPerConnectionSize(
161             int maxPoolPreparedStatementPerConnectionSize) {
162         this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
163     }
164     public String getFilters() {
165         return filters;
166     }
167     public void setFilters(String filters) {
168         this.filters = filters;
169     }
170     public String getConnectionProperties() {
171         return connectionProperties;
172     }
173     public void setConnectionProperties(String connectionProperties) {
174         this.connectionProperties = connectionProperties;
175     }
176
177 }

 

1.6,MybatisDataSourceConfig.java(注入工厂类)

1 /**
2  * Copyright 2017 JINZAY All Rights Reserved.
3  */
4 package bhz.uts.config.database;
5
6 import javax.sql.DataSource;
7
8 import org.apache.ibatis.session.SqlSessionFactory;
9 import org.mybatis.spring.SqlSessionFactoryBean;
10 import org.mybatis.spring.SqlSessionTemplate;
11 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.context.annotation.Bean;
13 import org.springframework.context.annotation.Configuration;
14 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
15 import org.springframework.core.io.support.ResourcePatternResolver;
16
17 @Configuration
18 public class MybatisDataSourceConfig {
19
20     @Autowired
21     private DataSource dataSource;
22
23     @Bean(name="sqlSessionFactory")
24     public SqlSessionFactory sqlSessionFactoryBean() {
25         SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
26         bean.setDataSource(dataSource);
27         // 添加XML目录
28         ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
29         try {
30             bean.setMapperLocations(resolver.getResources("classpath:bhz/uts/mapping/*.xml"));
31             SqlSessionFactory sqlSessionFactory = bean.getObject();
32             sqlSessionFactory.getConfiguration().setCacheEnabled(Boolean.TRUE);
33
34             return sqlSessionFactory;
35         } catch (Exception e) {
36             throw new RuntimeException(e);
37         }
38     }
39
40     @Bean
41     public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
42         return new SqlSessionTemplate(sqlSessionFactory);
43     }
44
45 }

 

1.7,MybatisMapperScanerConfig.java(扫描数据源类)

1 package bhz.uts.config.database;
2
3 import org.mybatis.spring.mapper.MapperScannerConfigurer;
4 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
5 import org.springframework.context.annotation.Bean;
6 import org.springframework.context.annotation.Configuration;
7
8 @Configuration
9 @AutoConfigureAfter(MybatisDataSourceConfig.class)
10 public class MybatisMapperScanerConfig {
11
12     @Bean
13     public MapperScannerConfigurer mapperScannerConfigurer() {
14         MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
15         mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
16         mapperScannerConfigurer.setBasePackage("bhz.uts.mapper");
17         return mapperScannerConfigurer;
18     }
19
20 }

 

1.8,封装数据源类(这个类负责从容器中来取到数据并设置到dataSource对象中来)

1 package bhz.uts.config.database;
2
3 import java.sql.SQLException;
4
5 import javax.sql.DataSource;
6
7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory;
9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.boot.web.servlet.FilterRegistrationBean;
11 import org.springframework.boot.web.servlet.ServletRegistrationBean;
12 import org.springframework.context.annotation.Bean;
13 import org.springframework.context.annotation.Configuration;
14 import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
15 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
16 import org.springframework.transaction.PlatformTransactionManager;
17 import org.springframework.transaction.annotation.EnableTransactionManagement;
18
19 import com.alibaba.druid.pool.DruidDataSource;
20 import com.alibaba.druid.support.http.StatViewServlet;
21 import com.alibaba.druid.support.http.WebStatFilter;
22
23 @Configuration
24 @EnableTransactionManagement
25 public class DruidDataSourceConfig {
26
27     private static Logger logger = LoggerFactory.getLogger(DruidDataSourceConfig.class);
28
29     @Autowired
30     private DruidDataSourceSettings druidSettings;
31
32     public static String DRIVER_CLASSNAME ;
33
34     @Bean
35     public static PropertySourcesPlaceholderConfigurer propertyConfigure(){
36         return new PropertySourcesPlaceholderConfigurer();
37     }
38     //扫描类
39     @Bean
40     public ServletRegistrationBean druidServlet() {
41
42         ServletRegistrationBean reg = new ServletRegistrationBean();
43         reg.setServlet(new StatViewServlet());
44 //        reg.setAsyncSupported(true);
45         reg.addUrlMappings("/druid/*");
46         reg.addInitParameter("allow", "127.0.0.1");
47 //        reg.addInitParameter("deny","/deny");
48         reg.addInitParameter("loginUsername", "bhz");
49         reg.addInitParameter("loginPassword", "bhz");
50         logger.info(" druid console manager init : {} ", reg);
51         return reg;
52     }
53    //扫描类
54     @Bean
55     public FilterRegistrationBean filterRegistrationBean() {
56         FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
57         filterRegistrationBean.setFilter(new WebStatFilter());
58         filterRegistrationBean.addUrlPatterns("/*");
59         filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico, /druid/*");
60         logger.info(" druid filter register : {} ", filterRegistrationBean);
61         return filterRegistrationBean;
62     }
63
64     @Bean
65     public DataSource dataSource() throws SQLException {
66         DruidDataSource ds = new DruidDataSource();
67         ds.setDriverClassName(druidSettings.getDriverClassName());
68         DRIVER_CLASSNAME = druidSettings.getDriverClassName();
69         ds.setUrl(druidSettings.getUrl());
70         ds.setUsername(druidSettings.getUsername());
71         ds.setPassword(druidSettings.getPassword());
72         ds.setInitialSize(druidSettings.getInitialSize());
73         ds.setMinIdle(druidSettings.getMinIdle());
74         ds.setMaxIdle(druidSettings.getMaxIdle());
75         ds.setMaxActive(druidSettings.getMaxActive());
76         ds.setTimeBetweenEvictionRunsMillis(druidSettings.getTimeBetweenEvictionRunsMillis());
77         ds.setMinEvictableIdleTimeMillis(druidSettings.getMinEvictableIdleTimeMillis());
78         ds.setValidationQuery(druidSettings.getValidationQuery());
79         ds.setTestWhileIdle(druidSettings.isTestWhileIdle());
80         ds.setTestOnBorrow(druidSettings.isTestOnBorrow());
81         ds.setTestOnReturn(druidSettings.isTestOnReturn());
82         ds.setPoolPreparedStatements(druidSettings.isPoolPreparedStatements());
83         ds.setMaxPoolPreparedStatementPerConnectionSize(druidSettings.getMaxPoolPreparedStatementPerConnectionSize());
84         ds.setFilters(druidSettings.getFilters());
85         ds.setConnectionProperties(druidSettings.getConnectionProperties());
86
87         //proxyFilters ===> 有问题
88 //        WallFilter wallFilter = new WallFilter();
89 //        WallConfig wallConfig = new WallConfig();
90 //        wallConfig.setMultiStatementAllow(true);
91 //        wallFilter.setConfig(wallConfig);
92 //        List<Filter> wallFilterList = new ArrayList<Filter>();
93 //        wallFilterList.add(wallFilter);
94 //        ds.setProxyFilters(wallFilterList);
95         logger.info(" druid datasource config : {} ", ds);
96         return ds;
97     }
98     //事务方法
99     @Bean
100     public PlatformTransactionManager transactionManager() throws Exception {
101         DataSourceTransactionManager txManager = new DataSourceTransactionManager();
102         txManager.setDataSource(dataSource());
103         return txManager;
104     }
105
106 }

二,任务时间控制类(在本项目中没有用到)

2.1,TaskSchedulerConfig.java

1 package bhz.uts.config.scheduler;
2
3 import java.util.concurrent.Executor;
4 import java.util.concurrent.Executors;
5
6 import org.springframework.context.annotation.Bean;
7 import org.springframework.context.annotation.Configuration;
8 import org.springframework.scheduling.annotation.EnableScheduling;
9 import org.springframework.scheduling.annotation.SchedulingConfigurer;
10 import org.springframework.scheduling.config.ScheduledTaskRegistrar;
11
12 @Configuration
13 @EnableScheduling
14 public class TaskSchedulerConfig implements SchedulingConfigurer {
15
16     @Override
17     public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
18         scheduledTaskRegistrar.setScheduler(taskScheduler());
19     }
20
21     @Bean(destroyMethod="shutdown")
22     public Executor taskScheduler(){
23         return Executors.newScheduledThreadPool(100);
24     }
25
26 }

三,实体类

3.1,BaseEntity.java

1 package bhz.uts.entity;
2
3 public class BaseEntity {
4
5     private String id;
6
7     public String getId() {
8         return id;
9     }
10
11     public void setId(String id) {
12         this.id = id;
13     }
14
15
16 }

 

3.2,TradeDetail.java

1 package bhz.uts.entity;
2
3 import java.math.BigDecimal;
4 import java.util.Date;
5
6 public class TradeDetail extends BaseEntity {
7
8     private String serialno;
9
10     private Date tradeDate;
11
12     private BigDecimal dedbitAmount;
13
14     private BigDecimal creditAmount;
15
16     private String businessType;
17
18     private BigDecimal balance;
19
20     private String oppAccountName;
21
22     private String oppAccountNo;
23
24     private String accountName;
25
26     private String accountNo;
27
28     private String digest;
29
30     private String status;
31
32     private String createBy;
33
34     private Date createTime;
35
36     private String updateBy;
37
38     private Date updateTime;
39
40     public String getSerialno() {
41         return serialno;
42     }
43
44     public void setSerialno(String serialno) {
45         this.serialno = serialno == null ? null : serialno.trim();
46     }
47
48     public Date getTradeDate() {
49         return tradeDate;
50     }
51
52     public void setTradeDate(Date tradeDate) {
53         this.tradeDate = tradeDate;
54     }
55
56     public BigDecimal getDedbitAmount() {
57         return dedbitAmount;
58     }
59
60     public void setDedbitAmount(BigDecimal dedbitAmount) {
61         this.dedbitAmount = dedbitAmount;
62     }
63
64     public BigDecimal getCreditAmount() {
65         return creditAmount;
66     }
67
68     public void setCreditAmount(BigDecimal creditAmount) {
69         this.creditAmount = creditAmount;
70     }
71
72     public String getBusinessType() {
73         return businessType;
74     }
75
76     public void setBusinessType(String businessType) {
77         this.businessType = businessType;
78     }
79
80     public BigDecimal getBalance() {
81         return balance;
82     }
83
84     public void setBalance(BigDecimal balance) {
85         this.balance = balance;
86     }
87
88     public String getOppAccountName() {
89         return oppAccountName;
90     }
91
92     public void setOppAccountName(String oppAccountName) {
93         this.oppAccountName = oppAccountName == null ? null : oppAccountName.trim();
94     }
95
96     public String getOppAccountNo() {
97         return oppAccountNo;
98     }
99
100     public void setOppAccountNo(String oppAccountNo) {
101         this.oppAccountNo = oppAccountNo == null ? null : oppAccountNo.trim();
102     }
103
104     public String getAccountName() {
105         return accountName;
106     }
107
108     public void setAccountName(String accountName) {
109         this.accountName = accountName;
110     }
111
112     public String getAccountNo() {
113         return accountNo;
114     }
115
116     public void setAccountNo(String accountNo) {
117         this.accountNo = accountNo == null ? null : accountNo.trim();
118     }
119
120     public String getDigest() {
121         return digest;
122     }
123
124     public void setDigest(String digest) {
125         this.digest = digest == null ? null : digest.trim();
126     }
127
128     public String getStatus() {
129         return status;
130     }
131
132     public void setStatus(String status) {
133         this.status = status == null ? null : status.trim();
134     }
135
136     public String getCreateBy() {
137         return createBy;
138     }
139
140     public void setCreateBy(String createBy) {
141         this.createBy = createBy == null ? null : createBy.trim();
142     }
143
144     public Date getCreateTime() {
145         return createTime;
146     }
147
148     public void setCreateTime(Date createTime) {
149         this.createTime = createTime;
150     }
151
152     public String getUpdateBy() {
153         return updateBy;
154     }
155
156     public void setUpdateBy(String updateBy) {
157         this.updateBy = updateBy == null ? null : updateBy.trim();
158     }
159
160     public Date getUpdateTime() {
161         return updateTime;
162     }
163
164     public void setUpdateTime(Date updateTime) {
165         this.updateTime = updateTime;
166     }
167 }

四,监听类

4.1,ApplicationFactory.java(容器类)

1 package bhz.uts.listener;
2
3 import org.springframework.beans.BeansException;
4 import org.springframework.context.ApplicationContext;
5 import org.springframework.context.ApplicationContextAware;
6 import org.springframework.stereotype.Component;
7 /**
8  * <B>系统名称:</B><BR>
9  * <B>模块名称:</B><BR>
10  * <B>中文类名:</B>ApplicationFactory<BR>
11  * <B>概要说明:</B><BR>
12  * @author baihezhuo
13  * @since 2017年5月27日 下午4:41:47
14  */
15 @Component
16 public class ApplicationFactory implements ApplicationContextAware {
17
18     private static ApplicationContext ctx = null;
19
20     @Override
21     public void setApplicationContext(ApplicationContext ctx) throws BeansException {
22         if (ApplicationFactory.ctx == null) {
23             ApplicationFactory.ctx = ctx;
24         }
25     }
26
27     // 获取applicationContext
28     public static ApplicationContext getApplicationContext() {
29         return ctx;
30     }
31
32     // 通过name获取 Bean.
33     public static Object getBean(String name) {
34         return getApplicationContext().getBean(name);
35     }
36
37     // 通过class获取Bean.
38     public static <T> T getBean(Class<T> clazz) {
39         return getApplicationContext().getBean(clazz);
40     }
41
42     // 通过name,以及Clazz返回指定的Bean
43     public static <T> T getBean(String name, Class<T> clazz) {
44         return getApplicationContext().getBean(name, clazz);
45     }
46
47
48 }

4.2,SpringListener.java(监控容器是否加载完的类)

1 package bhz.uts.listener;
2
3 import org.springframework.context.ApplicationListener;
4 import org.springframework.context.event.ContextRefreshedEvent;
5 import org.springframework.stereotype.Component;
6
7 import bhz.uts.netty.NettyClient;
8
9
10 @Component("springListener")
11 public class SpringListener implements ApplicationListener<ContextRefreshedEvent>{
12
13     @Override
14     public void onApplicationEvent(ContextRefreshedEvent event) {
15
16         if(event.getApplicationContext().getParent() == null){
17             //需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。
18             System.out.println("spring 加载完毕..");
19             try {
20                 NettyClient.getInstance().connect();
21             } catch (Exception e) {
22                 e.printStackTrace();
23             }
24         }
25
26
27
28     }
29
30
31
32 }

 spring容器加载好了之后在启动服务器端的链接

五,mapper类

5.1,TradeDetailMapper.java

1 package bhz.uts.mapper;
2
3 import java.util.List;
4
5 import org.apache.ibatis.annotations.Param;
6
7 import bhz.uts.config.database.BaseMapper;
8 import bhz.uts.entity.TradeDetail;
9
10 public interface TradeDetailMapper extends BaseMapper<TradeDetail> {
11
12     int updateStatusById(@Param("id")String id);
13
14     List<TradeDetail> queryByNotSync();
15
16 }

5.2,TradeDetailMapper.xml

1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
3 <mapper namespace="bhz.uts.mapper.TradeDetailMapper" >
4   <resultMap id="BaseResultMap" type="bhz.uts.entity.TradeDetail" >
5     <id column="ID" property="id" jdbcType="VARCHAR" />
6     <result column="SERIALNO" property="serialno" jdbcType="VARCHAR" />
7     <result column="TRADE_DATE" property="tradeDate" jdbcType="TIMESTAMP" />
8     <result column="DEDBIT_AMOUNT" property="dedbitAmount" jdbcType="DECIMAL" />
9     <result column="CREDIT_AMOUNT" property="creditAmount" jdbcType="DECIMAL" />
10     <result column="BUSINESS_TYPE" property="businessType" jdbcType="VARCHAR" />
11     <result column="BALANCE" property="balance" jdbcType="DECIMAL" />
12     <result column="OPP_ACCOUNT_NAME" property="oppAccountName" jdbcType="VARCHAR" />
13     <result column="OPP_ACCOUNT_NO" property="oppAccountNo" jdbcType="VARCHAR" />
14     <result column="ACCOUNT_NAME" property="accountName" jdbcType="VARCHAR" />
15     <result column="ACCOUNT_NO" property="accountNo" jdbcType="VARCHAR" />
16     <result column="DIGEST" property="digest" jdbcType="VARCHAR" />
17     <result column="STATUS" property="status" jdbcType="VARCHAR" />
18     <result column="CREATE_BY" property="createBy" jdbcType="VARCHAR" />
19     <result column="CREATE_TIME" property="createTime" jdbcType="TIMESTAMP" />
20     <result column="UPDATE_BY" property="updateBy" jdbcType="VARCHAR" />
21     <result column="UPDATE_TIME" property="updateTime" jdbcType="TIMESTAMP" />
22   </resultMap>
23   <sql id="Base_Column_List" >
24     ID, SERIALNO, TRADE_DATE, DEDBIT_AMOUNT, CREDIT_AMOUNT, BUSINESS_TYPE, BALANCE, OPP_ACCOUNT_NAME,
25     OPP_ACCOUNT_NO, ACCOUNT_NAME, ACCOUNT_NO, DIGEST, STATUS, CREATE_BY, CREATE_TIME,
26     UPDATE_BY, UPDATE_TIME
27   </sql>
28
29   <update id="updateStatusById" >
30           UPDATE TRADE_DETAIL SET STATUS = 1 WHERE ID = #{id,jdbcType=VARCHAR}
31   </update>
32
33   <select id="queryByNotSync" resultMap="BaseResultMap" >
34           SELECT * FROM TRADE_DETAIL WHERE STATUS = 0
35   </select>
36
37 </mapper>

六,service类

6.1,TradeDetailService.java

1 package bhz.uts.service;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.stereotype.Service;
5 import org.springframework.transaction.annotation.Transactional;
6
7 import com.alibaba.fastjson.JSONObject;
8
9 import bhz.uts.entity.TradeDetail;
10 import bhz.uts.mapper.TradeDetailMapper;
11 import bhz.uts.netty.NettyClient;
12 import bhz.uts.protocol.Req;
13 import bhz.uts.utils.Const;
14 import io.netty.channel.ChannelFuture;
15
16 @Service
17 public class TradeDetailService {
18
19
20     @Autowired
21     private TradeDetailMapper tradeDetailMapper;
22
23     @Transactional
24     public void sender(TradeDetail td) {
25
26         //1 insert
27         tradeDetailMapper.insert(td);
28         //2 transfer
29         //3,从clent角度来看,3.1,先把数据设置到req对象中来,假如有信息返回的话在去执行channelfuture里面的内容
30         ChannelFuture cf = NettyClient.getInstance().getChannelFuture();
31         Req req = new Req();
32         req.setId(td.getId());
33         req.setReqeustMessage(JSONObject.toJSONString(td));
34         req.setTag(Const.TRADE_DETAIL);
35         req.setType(Const.SAVE);
36         cf.channel().writeAndFlush(req);
37
38     }
39
40     public int updateStatusById(String id) {
41         return tradeDetailMapper.updateStatusById(id);
42     }
43
44
45 }

 

 加红色字体的就是最明显的异步非阻塞的代表,代码走到第30行的时候就会接着往下走,走31行的代码,而这时后开启的另一个线程就会去走第30行里面的数据,按照业务逻辑的话是31-36行和

group = new NioEventLoopGroup();
b = new Bootstrap();
b.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel sc) throws Exception {
sc.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder());
sc.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder());
sc.pipeline().addLast(new NettyClientHandler());

在前面的,只有它先在客户端把信息传递到服务端才会执行

 

 


@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
try {

Resp resp = (Resp)msg;
String id = resp.getId();
String tag = resp.getTag();
String type = resp.getType();
String responseCode = resp.getResponseCode();
String responseMessage = resp.getResponseMessage();

 

这里面的代码的。

 

 

6.2,SenderTradeDetailController.java(浏览器调用类)

1 package bhz.uts.service.api;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.web.bind.annotation.RequestMapping;
5 import org.springframework.web.bind.annotation.RequestParam;
6 import org.springframework.web.bind.annotation.RestController;
7
8 import bhz.uts.entity.TradeDetail;
9 import bhz.uts.service.TradeDetailService;
10 import bhz.uts.utils.GeneratorDataUtil;
11
12 @RestController
13 public class SenderTradeDetailController {
14
15     @Autowired
16     private TradeDetailService tradeDetailService;
17
18     @RequestMapping("/sender")
19     public void sender(@RequestParam("count") Integer count) throws Exception {
20
21         for(int i =0; i < count ; i ++){
22             TradeDetail td = GeneratorDataUtil.generator();
23             ///拿到数据以后, 调用service
24             tradeDetailService.sender(td);
25         }
26     }
27
28 }

http://localhost:8001/sender?count=10浏览器的请求网址是这个

七,编辑码的请求和相应类

7.1,Req.java

1 package bhz.uts.protocol;
2
3 import java.io.Serializable;
4
5 public class Req implements Serializable {
6
7
8     private static final long serialVersionUID = 1L;
9
10     private String id ;         //唯一ID
11     private String type ;        //操作类型
12     private String tag ;            //传输对象的类型:::
13     private String reqeustMessage;    //json对象
14     public String getId() {
15         return id;
16     }
17     public void setId(String id) {
18         this.id = id;
19     }
20     public String getType() {
21         return type;
22     }
23     public void setType(String type) {
24         this.type = type;
25     }
26     public String getTag() {
27         return tag;
28     }
29     public void setTag(String tag) {
30         this.tag = tag;
31     }
32     public String getReqeustMessage() {
33         return reqeustMessage;
34     }
35     public void setReqeustMessage(String reqeustMessage) {
36         this.reqeustMessage = reqeustMessage;
37     }
38
39
40
41
42
43
44
45
46 }

7.2,Resp.java

1 package bhz.uts.protocol;
2
3 import java.io.Serializable;
4
5 public class Resp implements  Serializable {
6
7
8     private static final long serialVersionUID = 1L;
9
10     private String id;
11     private String type;
12     private String tag;
13     private String responseCode;        //响应码::
14     private String responseMessage;
15
16
17     public String getId() {
18         return id;
19     }
20     public void setId(String id) {
21         this.id = id;
22     }
23     public String getType() {
24         return type;
25     }
26     public void setType(String type) {
27         this.type = type;
28     }
29     public String getTag() {
30         return tag;
31     }
32     public void setTag(String tag) {
33         this.tag = tag;
34     }
35     public String getResponseCode() {
36         return responseCode;
37     }
38     public void setResponseCode(String responseCode) {
39         this.responseCode = responseCode;
40     }
41     public String getResponseMessage() {
42         return responseMessage;
43     }
44     public void setResponseMessage(String responseMessage) {
45         this.responseMessage = responseMessage;
46     }
47
48
49
50
51 }

八,netty的客户端代码

8.1,MarshallingCodeCFactory.java(编解码类)

1 package bhz.uts.netty;
2
3 import io.netty.handler.codec.marshalling.DefaultMarshallerProvider;
4 import io.netty.handler.codec.marshalling.DefaultUnmarshallerProvider;
5 import io.netty.handler.codec.marshalling.MarshallerProvider;
6 import io.netty.handler.codec.marshalling.MarshallingDecoder;
7 import io.netty.handler.codec.marshalling.MarshallingEncoder;
8 import io.netty.handler.codec.marshalling.UnmarshallerProvider;
9
10 import org.jboss.marshalling.MarshallerFactory;
11 import org.jboss.marshalling.Marshalling;
12 import org.jboss.marshalling.MarshallingConfiguration;
13
14 /**
15  * Marshalling工厂
16  * @author(alienware)
17  * @since 2014-12-16
18  */
19 public final class MarshallingCodeCFactory {
20
21     /**
22      * 创建Jboss Marshalling解码器MarshallingDecoder
23      * @return MarshallingDecoder
24      */
25     public static MarshallingDecoder buildMarshallingDecoder() {
26         //首先通过Marshalling工具类的精通方法获取Marshalling实例对象 参数serial标识创建的是java序列化工厂对象。
27         final MarshallerFactory marshallerFactory = Marshalling.getProvidedMarshallerFactory("serial");
28         //创建了MarshallingConfiguration对象,配置了版本号为5
29         final MarshallingConfiguration configuration = new MarshallingConfiguration();
30         configuration.setVersion(5);
31         //根据marshallerFactory和configuration创建provider
32         UnmarshallerProvider provider = new DefaultUnmarshallerProvider(marshallerFactory, configuration);
33         //构建Netty的MarshallingDecoder对象,俩个参数分别为provider和单个消息序列化后的最大长度
34         MarshallingDecoder decoder = new MarshallingDecoder(provider, 1024 * 1024 * 1);
35         return decoder;
36     }
37
38     /**
39      * 创建Jboss Marshalling编码器MarshallingEncoder
40      * @return MarshallingEncoder
41      */
42     public static MarshallingEncoder buildMarshallingEncoder() {
43         final MarshallerFactory marshallerFactory = Marshalling.getProvidedMarshallerFactory("serial");
44         final MarshallingConfiguration configuration = new MarshallingConfiguration();
45         configuration.setVersion(5);
46         MarshallerProvider provider = new DefaultMarshallerProvider(marshallerFactory, configuration);
47         //构建Netty的MarshallingEncoder对象,MarshallingEncoder用于实现序列化接口的POJO对象序列化为二进制数组
48         MarshallingEncoder encoder = new MarshallingEncoder(provider);
49         return encoder;
50     }
51 }

 

8.2,NettyClient.java(客户端类)

1 package bhz.uts.netty;
2
3 import io.netty.bootstrap.Bootstrap;
4 import io.netty.channel.ChannelFuture;
5 import io.netty.channel.ChannelInitializer;
6 import io.netty.channel.EventLoopGroup;
7 import io.netty.channel.nio.NioEventLoopGroup;
8 import io.netty.channel.socket.SocketChannel;
9 import io.netty.channel.socket.nio.NioSocketChannel;
10
11 public class NettyClient {
12
13     private static class SingletionHolder {
14         static final NettyClient instance = new NettyClient();
15     }
16
17     public static NettyClient getInstance(){
18         return SingletionHolder.instance;
19     }
20
21     private String host = "127.0.0.1";
22
23     private int port = 8765;
24
25     private EventLoopGroup group;
26
27     private Bootstrap b;
28
29     private ChannelFuture cf;
30
31     private NettyClient(){
32         group = new NioEventLoopGroup();
33         b = new Bootstrap();
34         b.group(group)
35          .channel(NioSocketChannel.class)
36          .handler(new ChannelInitializer<SocketChannel>() {
37             @Override
38             protected void initChannel(SocketChannel sc) throws Exception {
39                 sc.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder());
40                 sc.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder());
41                 sc.pipeline().addLast(new NettyClientHandler());
42             }
43         });
44     }
45
46     public void connect(){
47         try {
48             this.cf = this.b.connect(host, port).sync();
49             System.err.println("远程服务器端已经连接.. 可以进行数据通信....");
50         } catch (InterruptedException e) {
51             e.printStackTrace();
52         }
53     }
54
55     public void close(){
56         try {
57             this.cf.channel().closeFuture().sync();
58             this.group.shutdownGracefully();
59         } catch (InterruptedException e) {
60             e.printStackTrace();
61         }
62     }
63
64     public ChannelFuture getChannelFuture(){
65         if(this.cf == null) {
66             this.connect();
67         }
68         if(!this.cf.channel().isActive()){
69             this.connect();
70         }
71         return this.cf;
72     }
73
74
75     public String getHost() {
76         return host;
77     }
78
79     public void setHost(String host) {
80         this.host = host;
81     }
82
83     public int getPort() {
84         return port;
85     }
86
87     public void setPort(int port) {
88         this.port = port;
89     }
90
91
92
93
94
95 }

8.3,NettyClientHandler.java(实现类)

1 package bhz.uts.netty;
2
3 import bhz.uts.listener.ApplicationFactory;
4 import bhz.uts.protocol.Resp;
5 import bhz.uts.service.TradeDetailService;
6 import bhz.uts.utils.Const;
7 import io.netty.channel.ChannelHandlerContext;
8 import io.netty.channel.ChannelInboundHandlerAdapter;
9 import io.netty.util.ReferenceCountUtil;
10
11 public class NettyClientHandler extends ChannelInboundHandlerAdapter {
12
13     @Override
14     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
15         try {
16
17             Resp  resp = (Resp)msg;
18             String id = resp.getId();
19             String tag = resp.getTag();
20             String type = resp.getType();
21             String responseCode = resp.getResponseCode();
22             String responseMessage = resp.getResponseMessage();
23
24             if(Const.TRADE_DETAIL.equals(tag)){
25                 TradeDetailService tradeDetailService = (TradeDetailService)ApplicationFactory.getBean("tradeDetailService");
26
27                 if(Const.RESPONSE_CODE_OK.equals(responseCode)){
28                     if(Const.UPDATE.equals(type)) {
29                         System.err.println("更新同步标志-----------: id: " + id);
30                         tradeDetailService.updateStatusById(id);
31                     }
32                 }
33             }
34
35         } finally {
36             ReferenceCountUtil.release(msg);
37         }
38
39     }
40
41
42 }

九,工具类

9.1,Const.java(常量类)

1 package bhz.uts.utils;
2
3 public final class Const {
4
5     public static final String TRADE_DETAIL = "trade_detail";
6     public static final String TRADE_BALANCE = "trade_balance";
7
8     public static final String QUERY = "query";
9     public static final String SAVE = "save";
10     public static final String UPDATE = "update";
11     public static final String DELETE = "delete";
12
13
14     public static final String RESPONSE_CODE_OK = "1";
15     public static final String RESPONSE_CODE_INSERT_ERR = "2";
16     public static final String RESPONSE_CODE_SERVER_ERR = "3";
17
18 }

 

9.2,FastJsonConvertUtil.java(json转化类)

1 package bhz.uts.utils;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import com.alibaba.fastjson.JSON;
7 import com.alibaba.fastjson.JSONObject;
8 import com.alibaba.fastjson.serializer.SerializerFeature;
9
10 /**
11  * <B>系统名称:</B>通用平台<BR>
12  * <B>模块名称:</B>通用平台-公共服务<BR>
13  * <B>中文类名:</B>通用平台-公共服务-FastJsonConvert<BR>
14  * <B>概要说明:</B><BR>
15  * @author bhz
16  * @since 2016年10月10日 上午11:01:52
17  */
18 public class FastJsonConvertUtil {
19
20     private static final SerializerFeature[] featuresWithNullValue = { SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullBooleanAsFalse,
21             SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty };
22
23     /**
24      * <B>方法名称:</B>将JSON字符串转换为实体对象<BR>
25      * <B>概要说明:</B>将JSON字符串转换为实体对象<BR>
26      * @param data JSON字符串
27      * @param clzss 转换对象
28      * @return T
29      */
30     public static <T> T convertJSONToObject(String data, Class<T> clzss) {
31         try {
32             T t = JSON.parseObject(data, clzss);
33             return t;
34         } catch (Exception e) {
35             e.printStackTrace();
36             return null;
37         }
38     }
39
40     /**
41      * <B>方法名称:</B>将JSONObject对象转换为实体对象<BR>
42      * <B>概要说明:</B>将JSONObject对象转换为实体对象<BR>
43      * @param data JSONObject对象
44      * @param clzss 转换对象
45      * @return T
46      */
47     public static <T> T convertJSONToObject(JSONObject data, Class<T> clzss) {
48         try {
49             T t = JSONObject.toJavaObject(data, clzss);
50             return t;
51         } catch (Exception e) {
52             e.printStackTrace();
53             return null;
54         }
55     }
56
57     /**
58      * <B>方法名称:</B>将JSON字符串数组转为List集合对象<BR>
59      * <B>概要说明:</B>将JSON字符串数组转为List集合对象<BR>
60      * @param data JSON字符串数组
61      * @param clzss 转换对象
62      * @return List<T>集合对象
63      */
64     public static <T> List<T> convertJSONToArray(String data, Class<T> clzss) {
65         try {
66             List<T> t = JSON.parseArray(data, clzss);
67             return t;
68         } catch (Exception e) {
69             e.printStackTrace();
70             return null;
71         }
72     }
73
74     /**
75      * <B>方法名称:</B>将List<JSONObject>转为List集合对象<BR>
76      * <B>概要说明:</B>将List<JSONObject>转为List集合对象<BR>
77      * @param data List<JSONObject>
78      * @param clzss 转换对象
79      * @return List<T>集合对象
80      */
81     public static <T> List<T> convertJSONToArray(List<JSONObject> data, Class<T> clzss) {
82         try {
83             List<T> t = new ArrayList<T>();
84             for (JSONObject jsonObject : data) {
85                 t.add(convertJSONToObject(jsonObject, clzss));
86             }
87             return t;
88         } catch (Exception e) {
89             e.printStackTrace();
90             return null;
91         }
92     }
93
94     /**
95      * <B>方法名称:</B>将对象转为JSON字符串<BR>
96      * <B>概要说明:</B>将对象转为JSON字符串<BR>
97      * @param obj 任意对象
98      * @return JSON字符串
99      */
100     public static String convertObjectToJSON(Object obj) {
101         try {
102             String text = JSON.toJSONString(obj);
103             return text;
104         } catch (Exception e) {
105             e.printStackTrace();
106             return null;
107         }
108     }
109
110     /**
111      * <B>方法名称:</B>将对象转为JSONObject对象<BR>
112      * <B>概要说明:</B>将对象转为JSONObject对象<BR>
113      * @param obj 任意对象
114      * @return JSONObject对象
115      */
116     public static JSONObject convertObjectToJSONObject(Object obj){
117         try {
118             JSONObject jsonObject = (JSONObject) JSONObject.toJSON(obj);
119             return jsonObject;
120         } catch (Exception e) {
121             e.printStackTrace();
122             return null;
123         }
124     }
125
126
127     /**
128      * <B>方法名称:</B><BR>
129      * <B>概要说明:</B><BR>
130      * @param obj
131      * @return
132      */
133     public static String convertObjectToJSONWithNullValue(Object obj) {
134         try {
135             String text = JSON.toJSONString(obj, featuresWithNullValue);
136             return text;
137         } catch (Exception e) {
138             e.printStackTrace();
139             return null;
140         }
141     }
142
143     public static void main(String[] args) {
144         System.err.println(System.getProperties());
145     }
146 }

 

9.3,GeneratorDataUtil.java(造数据的类)

1 package bhz.uts.utils;
2
3 import java.math.BigDecimal;
4 import java.text.SimpleDateFormat;
5 import java.util.Date;
6 import java.util.Random;
7 import java.util.UUID;
8
9 import bhz.uts.entity.TradeDetail;
10
11 public class GeneratorDataUtil {
12
13     private static Random random = new Random();
14
15     //交易时间:
16     private static Date getRandomDate(){
17         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
18         Date d = new Date(117,
19                 random.nextInt(7),
20                 (int)(Math.random()*28)+1,
21                 (int)(Math.random()*23)+1,
22                 (int)(Math.random()*59)+1,
23                 (int)(Math.random()*59)+1);
24         System.out.println(formatter.format(d));
25         return d;
26     }
27
28     static Object[] accounts = null;
29     static {
30         Pair p1 = new Pair<String, String>("张三", "30001040191113380583");
31         Pair p2 = new Pair<String, String>("李四", "40003242903000023274");
32         Pair p3 = new Pair<String, String>("王五", "50033457780002320965");
33         Pair p4 = new Pair<String, String>("赵六", "68886000080002320926");
34         accounts = new Object[]{p1, p2, p3, p4};
35     }
36
37     static Object[] oppAccounts = null;
38     static {
39         Pair p1 = new Pair<String, String>("小1", "500013334380543599");
40         Pair p2 = new Pair<String, String>("小2", "498980000566599998");
41         Pair p3 = new Pair<String, String>("小3", "788876699990005589");
42         Pair p4 = new Pair<String, String>("小4", "155500006660007779");
43         Pair p5 = new Pair<String, String>("小5", "344339999333000001");
44         oppAccounts = new Object[]{p1, p2, p3, p4, p5};
45     }
46
47     //
48     private static String generateSerialno(Date d){
49         SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
50         StringBuffer key = new StringBuffer();
51         key.append(formatter.format(d));
52         String uid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
53         key.append(uid.substring(12));
54         return key.toString();
55     }
56
57     //
58     private static Pair getRandomAccounts(){
59         return (Pair) accounts[random.nextInt(accounts.length)];
60     }
61
62     private static Pair getRandomOppAccounts(){
63         return (Pair) oppAccounts[random.nextInt(oppAccounts.length)];
64     }
65
66
67     static Object[] digests = null;
68     static {
69         String d1 = "转账";
70         String d2 = "付款";
71         String d3 = "百度买单";
72         String d4 = "美团买单";
73         String d5 = "淘宝买单";
74         digests = new Object[]{d1, d2, d3, d4, d5};
75     }
76
77     private static String getRandomDigest(){
78         return (String) digests[random.nextInt(digests.length)];
79     }
80
81     public static void main(String[] args) {
82         System.err.println(getRandomBalance());
83     }
84
85     private static int getRandomCreditAmount(){
86         return (int) ((Math.random()*100)+ (Math.random()*300) + (Math.random()*80));
87     }
88
89     private static int getRandomBalance(){
90         return (int) ((Math.random()*100000)+ (Math.random()*3000) + (Math.random()*500));
91     }
92
93
94     public static TradeDetail generator() {
95             TradeDetail td1 = new TradeDetail();
96             td1.setId(KeyUtil.generatorUUID());
97             Date tradeDate = getRandomDate();
98
99             td1.setSerialno(generateSerialno(tradeDate));
100             td1.setTradeDate(tradeDate);
101             td1.setCreditAmount(new BigDecimal(getRandomCreditAmount()));
102             td1.setDedbitAmount(new BigDecimal(0));
103             td1.setBusinessType("1");
104             td1.setBalance(new BigDecimal(getRandomBalance()));
105
106             Pair account = getRandomAccounts();
107
108             td1.setAccountName((String) account.getObject1());
109             td1.setAccountNo((String) account.getObject2());
110
111
112             Pair oppAccount = getRandomOppAccounts();
113             td1.setOppAccountName((String) oppAccount.getObject1());
114             td1.setOppAccountNo((String) oppAccount.getObject2());
115
116             td1.setDigest(getRandomDigest());
117             td1.setStatus("0");
118             td1.setCreateBy("system");
119             td1.setCreateTime(new Date());
120             td1.setUpdateBy("system");
121             td1.setUpdateTime(new Date());
122             return td1;
123
124     }
125
126 }

 

9.4,GzipUtil.java(压缩解压类)

1 package bhz.uts.utils;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.ByteArrayOutputStream;
5 import java.io.File;
6 import java.io.FileInputStream;
7 import java.io.FileOutputStream;
8 import java.util.zip.GZIPInputStream;
9 import java.util.zip.GZIPOutputStream;
10
11 public class GzipUtil {
12
13     public static byte[] gzip(byte[] data) throws Exception{
14         ByteArrayOutputStream bos = new ByteArrayOutputStream();
15         GZIPOutputStream gzip = new GZIPOutputStream(bos);
16         gzip.write(data);
17         gzip.finish();
18         gzip.close();
19         byte[] ret = bos.toByteArray();
20         bos.close();
21         return ret;
22     }
23
24     public static byte[] ungzip(byte[] data) throws Exception{
25         ByteArrayInputStream bis = new ByteArrayInputStream(data);
26         GZIPInputStream gzip = new GZIPInputStream(bis);
27         byte[] buf = new byte[1024];
28         int num = -1;
29         ByteArrayOutputStream bos = new ByteArrayOutputStream();
30         while((num = gzip.read(buf, 0 , buf.length)) != -1 ){
31             bos.write(buf, 0, num);
32         }
33         gzip.close();
34         bis.close();
35         byte[] ret = bos.toByteArray();
36         bos.flush();
37         bos.close();
38         return ret;
39     }
40
41     public static void main(String[] args) throws Exception{
42
43         //读取文件
44         String readPath = System.getProperty("user.dir") + File.separatorChar + "sources" +  File.separatorChar + "006.jpg";
45         File file = new File(readPath);
46         FileInputStream in = new FileInputStream(file);
47         byte[] data = new byte[in.available()];
48         in.read(data);
49         in.close();
50
51         System.out.println("文件原始大小:" + data.length);
52         //测试压缩
53
54         byte[] ret1 = GzipUtil.gzip(data);
55         System.out.println("压缩之后大小:" + ret1.length);
56
57         byte[] ret2 = GzipUtil.ungzip(ret1);
58         System.out.println("还原之后大小:" + ret2.length);
59
60         //写出文件
61         String writePath = System.getProperty("user.dir") + File.separatorChar + "receive" +  File.separatorChar + "006.jpg";
62         FileOutputStream fos = new FileOutputStream(writePath);
63         fos.write(ret2);
64         fos.close();
65
66
67     }
68
69
70
71 }

 

9.5,KeyUtil.java(主键生成策略类)

1 package bhz.uts.utils;
2
3 import java.util.UUID;
4
5 import com.fasterxml.uuid.EthernetAddress;
6 import com.fasterxml.uuid.Generators;
7 import com.fasterxml.uuid.impl.TimeBasedGenerator;
8
9 /**
10  * <B>系统名称:</B>通用平台<BR>
11  * <B>模块名称:</B>通用平台-公共服务<BR>
12  * <B>中文类名:</B>KeyUtils<BR>
13  * <B>概要说明:</B>主键生成策略-工具类<BR>
14  * @author baihezhuo
15  * @since 2017年2月21日 下午1:55:42
16  */
17 public class KeyUtil {
18
19     /**
20      * <B>方法名称:</B>generatorUUID<BR>
21      * <B>概要说明:</B>主键生成策略<BR>
22      * @author baihezhuo
23      * @since 2017年2月21日 下午2:00:06
24      * @return UUID String
25      */
26     public static String generatorUUID(){
27         TimeBasedGenerator timeBasedGenerator = Generators.timeBasedGenerator(EthernetAddress.fromInterface());
28         return timeBasedGenerator.generate().toString();
29     }
30
31
32
33 }

 

9.6,Pair.java(键值对类)

1 package bhz.uts.utils;
2
3 public class Pair<T1, T2> {
4     private T1 object1;
5     private T2 object2;
6
7     public Pair(T1 object1, T2 object2) {
8         this.object1 = object1;
9         this.object2 = object2;
10     }
11
12     public T1 getObject1() {
13         return object1;
14     }
15
16     public void setObject1(T1 object1) {
17         this.object1 = object1;
18     }
19
20     public T2 getObject2() {
21         return object2;
22     }
23
24     public void setObject2(T2 object2) {
25         this.object2 = object2;
26     }
27 }

 

十,主类

10.1,MainConfig.java(主要扫描类)

1 package bhz.uts;
2
3 import org.mybatis.spring.annotation.MapperScan;
4 import org.springframework.context.annotation.ComponentScan;
5 import org.springframework.context.annotation.Configuration;
6
7 @Configuration
8 @MapperScan(basePackages = "bhz.uts.mapper")
9 @ComponentScan(basePackages = {"bhz.uts.*", "bhz.uts.config.*"})
10 public class MainConfig {
11
12 }

 

10.2,UtsSenderApplication.java(springboot的启动类)

1 package bhz.uts;
2
3 import org.springframework.boot.SpringApplication;
4 import org.springframework.boot.autoconfigure.SpringBootApplication;
5
6 @SpringBootApplication
7 public class UtsSenderApplication {
8
9     public static void main(String[] args) {
10         SpringApplication.run(UtsSenderApplication.class, args);
11     }
12 }

 

控制台:

1 Java HotSpot(TM) 64-Bit Server VM warning: MaxNewSize (524288k) is equal to or greater than the entire heap (524288k).  A new generation size of 524224k will be used.
2
3   .   ____          _            __ _ _
4  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
5 ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
6  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
7   '  |____| .__|_| |_|_| |_\__, | / / / /
8  =========|_|==============|___/=/_/_/_/
9  :: Spring Boot ::        (v1.5.6.RELEASE)
10
11 2018-03-21 20:31:27.719  INFO 2180 --- [           main] bhz.uts.UtsSenderApplication             : Starting UtsSenderApplication on qingruihappy with PID 2180 (D:\workspace\uts-sender\target\classes started by Administrator in D:\workspace\uts-sender)
12 2018-03-21 20:31:27.731  INFO 2180 --- [           main] bhz.uts.UtsSenderApplication             : No active profile set, falling back to default profiles: default
13 2018-03-21 20:31:27.834  INFO 2180 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@594001dc: startup date [Wed Mar 21 20:31:27 CST 2018]; root of context hierarchy
14 2018-03-21 20:31:29.885  WARN 2180 --- [           main] o.m.s.mapper.ClassPathMapperScanner      : Skipping MapperFactoryBean with name 'tradeDetailMapper' and 'bhz.uts.mapper.TradeDetailMapper' mapperInterface. Bean already defined with the same name!
15 2018-03-21 20:31:29.885  WARN 2180 --- [           main] o.m.s.mapper.ClassPathMapperScanner      : No MyBatis mapper was found in '[bhz.uts.mapper]' package. Please check your configuration.
16 2018-03-21 20:31:29.887  WARN 2180 --- [           main] o.s.c.a.ConfigurationClassPostProcessor  : Cannot enhance @Configuration bean definition 'mybatisMapperScanerConfig' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'.
17 2018-03-21 20:31:30.295  WARN 2180 --- [           main] figurationPropertiesBindingPostProcessor : Multiple PropertySourcesPlaceholderConfigurer beans registered [propertyConfigure, properdtyConfigure], falling back to Environment
18 2018-03-21 20:31:33.128  INFO 2180 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8001 (http)
19 2018-03-21 20:31:33.176  INFO 2180 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
20 2018-03-21 20:31:33.178  INFO 2180 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.16
21 2018-03-21 20:31:33.811  INFO 2180 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
22 2018-03-21 20:31:33.812  INFO 2180 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 5994 ms
23 2018-03-21 20:31:34.079  INFO 2180 --- [ost-startStop-1] b.u.c.database.DruidDataSourceConfig     :  druid console manager init : org.springframework.boot.web.servlet.ServletRegistrationBean@13084eb3
24 2018-03-21 20:31:34.143  INFO 2180 --- [ost-startStop-1] b.u.c.database.DruidDataSourceConfig     :  druid filter register : org.springframework.boot.web.servlet.FilterRegistrationBean@4863d07f
25 2018-03-21 20:31:34.941  INFO 2180 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'statViewServlet' to [/druid/*]
26 2018-03-21 20:31:34.943  INFO 2180 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
27 2018-03-21 20:31:34.948  INFO 2180 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
28 2018-03-21 20:31:34.949  INFO 2180 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
29 2018-03-21 20:31:34.950  INFO 2180 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
30 2018-03-21 20:31:34.950  INFO 2180 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
31 2018-03-21 20:31:34.950  INFO 2180 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'webStatFilter' to urls: [/*]
32 2018-03-21 20:31:35.136 ERROR 2180 --- [           main] c.a.druid.pool.DruidAbstractDataSource   : maxIdle is deprecated
33 2018-03-21 20:31:35.172  INFO 2180 --- [           main] b.u.c.database.DruidDataSourceConfig     :  druid datasource config : {
34     CreateTime:"2018-03-21 20:31:35",
35     ActiveCount:0,
36     PoolingCount:0,
37     CreateCount:0,
38     DestroyCount:0,
39     CloseCount:0,
40     ConnectCount:0,
41     Connections:[
42     ]
43 }
44
45 [
46 ]
47 2018-03-21 20:31:36.521  INFO 2180 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@594001dc: startup date [Wed Mar 21 20:31:27 CST 2018]; root of context hierarchy
48 2018-03-21 20:31:36.648  INFO 2180 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/sender]}" onto public void bhz.uts.service.api.SenderTradeDetailController.sender(java.lang.Integer) throws java.lang.Exception
49 2018-03-21 20:31:36.657  INFO 2180 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
50 2018-03-21 20:31:36.658  INFO 2180 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
51 2018-03-21 20:31:36.726  INFO 2180 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
52 2018-03-21 20:31:36.727  INFO 2180 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
53 2018-03-21 20:31:36.886  INFO 2180 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
54 2018-03-21 20:31:38.052  INFO 2180 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
55 2018-03-21 20:31:38.054  INFO 2180 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Bean with name 'dataSource' has been autodetected for JMX exposure
56 2018-03-21 20:31:38.065  INFO 2180 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Located MBean 'dataSource': registering with JMX server as MBean [com.alibaba.druid.pool:name=dataSource,type=DruidDataSource]
57 spring 加载完毕..
58 远程服务器端已经连接.. 可以进行数据通信....
59 2018-03-21 20:31:40.279  INFO 2180 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8001 (http)
60 2018-03-21 20:31:40.284  INFO 2180 --- [           main] bhz.uts.UtsSenderApplication             : Started UtsSenderApplication in 14.68 seconds (JVM running for 19.764)
61 2018-03-21 20:31:46.045  INFO 2180 --- [nio-8001-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
62 2018-03-21 20:31:46.046  INFO 2180 --- [nio-8001-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
63 2018-03-21 20:31:46.186  INFO 2180 --- [nio-8001-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 140 ms
64 2017-06-24 20:14:49
65 2018-03-21 20:31:48.117  INFO 2180 --- [nio-8001-exec-1] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
66 2017-01-14 14:49:26
67 2017-02-05 13:26:04
68 2017-05-22 04:10:30
69 2017-05-22 14:36:46
70 更新同步标志-----------: id: d2119747-2d03-11e8-b721-6c881435c21c
71 更新同步标志-----------: id: d37f09f8-2d03-11e8-b721-6c881435c21c
72 更新同步标志-----------: id: d3c0cde9-2d03-11e8-b721-6c881435c21c
73 更新同步标志-----------: id: d3f3017a-2d03-11e8-b721-6c881435c21c
74 更新同步标志-----------: id: d424239b-2d03-11e8-b721-6c881435c21c
75 2017-03-18 12:42:58
76 更新同步标志-----------: id: d460905c-2d03-11e8-b721-6c881435c21c
77 2017-01-17 16:25:36
78 更新同步标志-----------: id: d48e300d-2d03-11e8-b721-6c881435c21c
79 2017-01-17 23:11:41
80 更新同步标志-----------: id: d4babe4e-2d03-11e8-b721-6c881435c21c
81 2017-07-26 14:46:20
82 更新同步标志-----------: id: d4e8ac1f-2d03-11e8-b721-6c881435c21c
83 2017-06-16 18:03:53
84 更新同步标志-----------: id: d51699f0-2d03-11e8-b721-6c881435c21c

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐