新年第一天上班的回顾

半年见闻–技术篇

从学校毕业已经半年了,一直拖欠的小结终于在今天有了眉目:

  • 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

猜你喜欢

转载自blog.csdn.net/sinat_23324343/article/details/54893712