半年见闻–技术篇
从学校毕业已经半年了,一直拖欠的小结终于在今天有了眉目:
- gradle/maven自动化构建工具
- 数据库可视化工具NavicatPremium与Robomongo
- SVN管理与使用
- Linux基本命令
- MongoDB的安装
- 阿里大于短信代理
- quartz定时任务
- mybatis
- mikrotik白名单
Linux基本命令
ls 显示文件或目录
mkdir 创建目录
cd 切换目录
touch 创建空文件
echo 创建带有内容的文件。
cat 查看文件内容
cp 拷贝
mv 移动或重命名
rm -rf 删除文件
find 在文件系统中搜索某文件
grep 在文本文件中查找某个字符串
rmdir 删除空目录
pwd 显示当前目录
ps -ef 查看进程
kill -9 关闭进程
tail -f 查看日志
在Linux系统下,重启Tomcat命令
首先,进入Tomcat下的bin目录
例:cd /usr/local/tomcat/bin
使用Tomcat关闭命令
./shutdown.sh
查看Tomcat是否以关闭
ps -ef|grep java
如果显示以下相似信息,说明Tomcat还没有关闭
root 7010 1 0 Apr19 ? 00:30:13 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
如果你想直接干掉Tomcat,你可以使用kill命令,直接杀死Tomcat进程
kill -9 7010
然后继续查看Tomcat是否关闭
ps -ef|grep java
如果出现以下信息,则表示Tomcat已经关闭
root 7010 1 0 Apr19 ? 00:30:30 [java] <defunct>
最后,启动Tomcat
./startup.sh
mongodb的安装
通过Linux进行mongodb的安装 配置主从复制读写分离(27017一般为默认端口)
(不同服务器,或同一服务器不同端口)
1、用CRT连接目标服务器(主、从)
2、cd /devhome
3、mkdir mongodb 新建mongodb目录
4、rz 添加mongodb安装包
5、解压(unzip zip包名,tar zxvf tgz包名…不同类型的包解压命令不同)
6、解压完成后在该目录下创建data目录(mkdir data_master/data_slave),log文件(touch log_master/log_slave)
7、cd bin进入bin目录
8、启动mongodb,
设置master
./mongod --master -dbpath=/devhome/mongodb/mongodb-linux-x86_64-rhel62-3.2.4/data_master
--logpath=/devhome/mongodb/mongodb-linux-x86_64-rhel62-3.2.4/log_master --port 27017 --logappend --fork
设置slave
./mongod --slave --source=127.0.0.1:27017 --dbpath=/devhome/mongodb/mongodb-linux-x86_64-rhel62-3.2.4/data_slave/
--logpath=/devhome/mongodb/mongodb-linux-x86_64-rhel62-3.2.4/log_slave --port 27018 --logappend --fork
9、在bin目录下执行./mongo 主服务器名:端口号
>db.test.insert({name:"*****"}) -------插入内容
>db.test.find() -------查看结果
10、在bin目录下执行./mongo 从服务器名:端口号
>db.getMongo().setSlaveOk() -------实现从主服务器上复制数据
>db.test.find() -------得到与主服务器同样的结果
在bin下执行pstree -p|grep mongod 查看mongo进程
在bin下执行kill -15 pid 关闭进程
注意
可能会出现Master服务器Down掉之后,需要用Slave服务器来顶替Master提供服务器的情况,这个时候就需要做如下操作:
停止Slave进程(mongod)
删除Slave数据目录中的local.*
以–master模式启动Slave
这个时候,Slave就可以作为一个Master来运行了。
MongoDB的日志文件在设置 logappend=true 的情况下,会不断向同一日志文件追加的,时间长了,自然变得非常大
解决如下:(特别注意:启动的时候必须是–logpath指定了log路径的)
用mongo连接到服务端
>use admin //切换到admin数据库
>db.runCommand({logRotate:1})
这样会使mongo关闭当前日志文件,重启一个新的日志文件,不需要停止mongodb服务
短信代理
申请短信模板成功后,通过短信供应商提供的接口和相关参数实现短信
alibaba.aliqin.fc.sms.num.send(短信发送) 接口详情
TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret);
AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest();
req.setExtend("123456");
req.setSmsType("normal");
req.setSmsFreeSignName("阿里大于");
req.setSmsParamString("{\"code\":\"1234\",\"product\":\"alidayu\"}");
req.setRecNum("13000000000");
req.setSmsTemplateCode("SMS_585014");
AlibabaAliqinFcSmsNumSendResponse rsp = client.execute(req);
System.out.println(rsp.getBody());
alibaba.aliqin.fc.sms.num.query(短信发送记录查询) 接口详情
TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret);
AlibabaAliqinFcSmsNumQueryRequest req = new AlibabaAliqinFcSmsNumQueryRequest();
req.setBizId( "1234^1234" );
req.setRecNum( "13000000000" );
req.setQueryDate( "20151215" );
req.setCurrentPage(1L);
req.setPageSize(10L);
AlibabaAliqinFcSmsNumQueryResponse rsp = client.execute(req);
System.out.println(rsp.getBody());
alibaba.aliqin.fc.tts.num.singlecall (文本转语音) 接口详情
TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret);
AlibabaAliqinFcTtsNumSinglecallRequest req = new AlibabaAliqinFcTtsNumSinglecallRequest();
req.setExtend( "" );
req.setTtsParamString( "" );
req.setCalledNum( "13700000000" );
req.setCalledShowNum( "40012341234" );
req.setTtsCode( "TTS_1234123" );
AlibabaAliqinFcTtsNumSinglecallResponse rsp = client.execute(req);
System.out.println(rsp.getBody());
quartz定时任务
关键词:
Trigger:描述触发执行的时间
Schedule:相当于quartz的调度器
JobDetail:Job实例的描述信息
配置文件: quartz-jobs.xml 、quartz-triggers.xml、quartz.properties
quartz-jobs.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 短信使用情况统计任务 -->
<bean id="collectSmsStatTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="collectSmsStatJob" />
<property name="cronExpression" value="30 10 2 * * ?"/>
</bean>
<bean id="collectSmsStatJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.commain.didadi.task.SmsStatCollectionTask" />
<property name="durability" value="true" />
</bean>
</beans>
quartz-triggers.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<import resource="quartz-jobs.xml" />
<util:list id="quartzTriggers">
<!-- 调度清单 -->
<ref bean="collectSmsStatTrigger"/>
</util:list>
<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers" ref="quartzTriggers" />
<property name="configLocation" value="classpath:quartz.properties" />
<!-- 初始化之后延迟20秒启动scheduler -->
<property name="startupDelay" value="20" />
<property name="dataSource" ref="dataSource" />
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="overwriteExistingJobs" value="true" />
</bean>
</beans>
quartz.properties
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = TrosQuartzScheduler
org.quartz.scheduler.instanceId = AUTO
#Quartz内置了一个“更新检查”特性,因此Quartz项目每次启动后都会检查官网,Quartz是否存在新版本。
#这个检查是异步的,不影响Quartz项目本身的启动和初始化。
org.quartz.scheduler.skipUpdateCheck = true
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 20
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.useProperties = false
# 数据表设置
org.quartz.jobStore.tablePrefix = QRTZ_
# 集群配置
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 15000
时间配置: 秒 分 时 日 月 周 年(可不设置)
通配符说明:
* :表示所有值. 例如:在分的字段上设置 “*”,表示每一分钟都会触发。
? :表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为”?” 具体设置为 0 0 0 10 * ?
- :表示区间。例如 在小时上设置 “10-12”,表示 10,11,12点都会触发。
, :表示指定多个值,例如在周字段上设置 “MON,WED,FRI” 表示周一,周三和周五触发
/ :用于递增触发。如在秒上面设置”5/15” 表示从5秒开始,每增15秒触发(5,20,35,50)。 在月字段上设置’1/3’所示每月1号开始,每隔三天触发一次。
L :表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于”7”或”SAT”。如果在”L”前加上数字,则表示该数据的最后一个。
例如在周字段上设置”6L”这样的格式,则表示“本月最后一个星期五”
W :表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置”15W”,表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 “1W”,它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,”W”前只能设置具体的数字,不允许区间”-“).
‘L’和 ‘W’可以一组合使用。如果在日字段上设置”LW”,则表示在本月的最后一个工作日触发
#:序号(表示每月的第几周星期几),例如在周字段上设置”6#3”表示在每月的第三个周星期六.注意如果指定”6#5”,正好第五周没有星期六,则不会触发该配置(用在母亲节和父亲节再合适不过了)
周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同.
常用示例:
0 0 1 * * ? 每天1点触发
0 1 1 ? * * 每天1点1分触发
0 1 1 * * ? 2005 2005年每天1点1分触发
0 * 14 * * ? 每天下午的 2点到2点59分每分触发
0 0/5 14 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)
0 0/5 14,18 * * ? 每天下午的 2点到6点59分(整点开始,每隔5分触发)
0 0-5 14 * * ? 每天下午的 2点到2点05分每分触发
0 10,30 14 ? 3 WED 3月分每周三下午的 2点10分和2点30分触发
0 15 10 ? * MON-FRI 从周一到周五每天上午的10点15分触发
0 15 10 15 * ? 每月15号上午10点15分触发
0 15 10 L * ? 每月最后一天的10点15分触发
0 15 10 ? * 6L 每月最后一周的星期五的10点15分触发
0 15 10 ? * 6L 2002-2005 从2002年到2005年每月最后一周的星期五的10点15分触发
0 15 10 ? * 6#3 每月的第三周的星期五开始触发
0 0 12 1/5 * ? 每月的第一个12点开始每隔5天触发一次
quartz实现串行的2种方案
- 通过MethodInvokingJobDetailFactoryBean在运行中动态生成Job;
配置的job.xml文件有concurrent属性.
<peoperty name="concurrent" value="false"/>
- 通过自定义要执行任务的类名称实现Job;
默认的任务类实现org.quartz.job接口,此时任务是stateless(无状态的),使QuartzJobBean类实现org.quartz.StatefulJob接口
class SpringAutowiringSupportedQuartzJobBean extends QuartzJobBean implements StatefulJob{
...
}
Mybatis
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。
从 XML 中构建 SqlSessionFactory
XML 配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 实例化sqlSessionFactory时需要使用上述配置好的数据源以及SQL映射文件 -->
<property name="mapperLocations" value="classpath:com/mybatis/didadi/dao/mapper/*.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描com.mybatis.didadi.dao这个包以及它的子包下的所有映射接口类 -->
<property name="basePackage" value="com.mybatis.didadi.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 打印查询语句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
</configuration>
- 不使用 XML 构建 SqlSessionFactory
也可以直接从 Java 程序而不是 XML 文件中创建 configuration,或者创建 configuration 构建器,MyBatis 也提供了完整的配置类,提供所有和 XML 文件相同功能的配置项。
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
从 SqlSessionFactory 中获取 SqlSession
SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法通过 SqlSession 实例来直接执行已映射的 SQL 语句
SqlSession session = sqlSessionFactory.openSession(); try { Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101); } finally { session.close(); }
使用对于给定语句能够合理描述参数和返回值的接口
这些在官方文档上都有很详细的介绍。。。
官网:http://www.mybatis.org/mybatis-3/zh/index.html
Mikrotik白名单
官网:http://wiki.mikrotik.com/wiki/Manual:IP/Hotspot/Walled_Garden#Example