0%

先试试把开环境用docker来部署。

http://docs.docker.com/engine/installation/centos/
直接按照这里安装就可以了,不过我在这里遇到了一点问题。
我是centos6.5,内核在 3.8 以上
通过以下命令查看您的 CentOS 内核:

uname -r

如果执行以上命令后,输出的内核版本号低于 3.8,请参考下面的方法来来升级您的 Linux 内核。

对于 CentOS 6.5 而言,内核版本默认是 2.6。首先,可通过以下命令安装最新内核:

1
2
3
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
yum -y --enablerepo=elrepo-kernel install kernel-lt

随后,编辑以下配置文件:

1
vi /etc/grub.conf

default=1修改为default=0

阅读全文 »

转载:http://www.dengchuanhua.com/132.html

在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12位。

该项目地址为:https://github.com/twitter/snowflake是用Scala实现的。

python版详见开源项目https://github.com/erans/pysnowflake。

核心代码为其IdWorker这个类实现,其原理结构如下,我分别用一个0表示一位,用—分割开部分的作用:

1
0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---0000000000 00

在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间,然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识),然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。

这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。

阅读全文 »

随着我们的应用后台不断的发版,因为改动导致了数据结构的变化,这个时候就需要对HTTP API进行版本控制了。对原有的客户端进行兼容,搜索一番后找到一个方法。
先看这个文章,提供了一个解决方案。
http://www.cnblogs.com/jcli/p/springmvc_restful_version.html

Spring MVC通过在方法上使用RequestMapping来确认应该使用哪个方法来响应相应的请求,而RequestMapping又通过各种RequestCondition的实现来完成各种过滤(比如:consumes,headers,methods,params,produces以及value等)。在Spring MVC框架中使用RequestConditionHolder和RequestMappingInfo这两个实现。

自定义RequestCondition
  • 实现RequestCondition接口
1
2
3
4
5
6
7
8
9
10
package org.springframework.web.servlet.mvc.condition;

import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;

public interface RequestCondition<T> {
T combine(T other);
T getMatchingCondition(HttpServletRequest request);
int compareTo(T other, HttpServletRequest request);
}
  • 继承RequestMappingHandlerMapping
    • getCustomTypeCondition方法根据对应的Handler类返回类级别的condition
    • getCustomMethodCondition方法根据对应的Handler方法返回方法级别的condition
阅读全文 »

在做项目的时候出现一个错误,看了半天没看出来是什么问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
root cause
java.util.NoSuchElementException
java.util.ArrayList$Itr.next(ArrayList.java:834)
org.apache.jasper.compiler.Validator$ValidateVisitor.getJspAttribute(Validator.java:1385)
org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:772)
org.apache.jasper.compiler.Node$UninterpretedTag.accept(Node.java:1251)
org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2377)
org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2429)
org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:779)
org.apache.jasper.compiler.Node$UninterpretedTag.accept(Node.java:1251)
org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2377)
org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2429)
org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:529)
org.apache.jasper.compiler.Node$JspRoot.accept(Node.java:564)
org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2377)
org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2429)
org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2435)
org.apache.jasper.compiler.Node$Root.accept(Node.java:474)
org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2377)
org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1841)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:217)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:657)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

找了半天才发现是tomcat的一个bug,换了一个tomcat版本就好了
导致这个错误的原因如下

1
<jsp:param name="test" value="" />

如果是value是空值,在某些tomcat版本下就会出现这个情况,如果你遇见了,不妨换个版本试试。

<mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。<mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。

这句话我在很多帖子都看到过,我自己的项目本身使用的Spring MVC 3.2,实际上在3.1之后,<mvc:annotation-driven />注册的类发生了变化

Spring Framework 3.1 introduces a new set of support classes for processing requests with annotated controllers:

RequestMappingHandlerMapping
RequestMappingHandlerAdapter
ExceptionHandlerExceptionResolver
These classes are a replacement for the existing:

DefaultAnnotationHandlerMapping
AnnotationMethodHandlerAdapter
AnnotationMethodHandlerExceptionResolver

阅读全文 »

Nexus篇

在Centos上安装

如果机器上是JDK1.6的话,nexus-2.5.1是最后一个支持JDK1.6的版本。

下载地址:http://www.sonatype.org/nexus/archived

我这里使用FTP工具上传到服务器上。执行命令的时候如果遇到没有权限的地方用chmod改变文件权限。

设置为系统自启动服务(使用root用户)

1
2
cd /etc/init.d/
cp /usr/local/jdk/nexus-2.5.1-01/bin/jsw/linux-x86-64/nexus nexus

编辑/etc/init.d/nexus文件,添加以下变量定义:

1
2
3
NEXUS_HOME=/usr/local/jdk/nexus-2.5.1-01
PLATFORM=linux-x86-64
PLATFORM_DIR="${NEXUS_HOME}/bin/jsw/${PLATFORM}"
阅读全文 »

官方放出了mybatis和memcached的整合包,先附上官方文档地址
http://mybatis.github.io/memcached-cache/
文档很简洁,事实证明使用起来也很简单
memcached的安装我这里就不再讲了,网上很容易找到
在项目中引入

1
2
3
4
5
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-memcached</artifactId>
<version>1.0.0</version>
</dependency>
阅读全文 »

要使用yum 安装mysql,要使用mysql的yum仓库,先从官网下载适合你系统的仓库
http://dev.mysql.com/downloads/repo/yum/
centos 6.5 对应的是mysql-community-release-el6-5.noarch.rpm
然后安装一下这个仓库列表

1
sudo yum localinstall mysql-community-release-el6-5.noarch.rpm 

执行这个命令后就能看到可安装的mysql

1
yum repolist enabled | grep "mysql.*-community.*"
阅读全文 »