Jconsole远程连接运行在linux上的JMX服务

JMX的bug尼玛 坑死我了

linux下 命令hostname -i查看获取当前服务器在网络上的标识。

vi /etc/hosts 
192.168.1.4   localhost
127.0.0.1       localhost
真实IP一定要卸载前面


MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

        // 包名加 类名 创建一个ObjectName

        ObjectName engineName = new ObjectName(“cn.com.eightspace.mbp.jmx:type=DeviceIO”);

        // 创建一个Engine实例

        DeviceIO engineMbean = new DeviceIO();

        System.out.println(“注册对象:” + engineMbean);

        // 在MBean server上注册MBean

        mBeanServer.registerMBean(engineMbean, engineName);


        ObjectName adaptorName = new ObjectName(htmlname);


        // 使用html适配器,支持网页访问

        HtmlAdaptorServer adaptor = new HtmlAdaptorServer();

        mBeanServer.registerMBean(adaptor, adaptorName);

        adaptor.setPort(port);

        adaptor.start(); 




参数设置:   -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false 

秦岭无岭处

如果你是秦岭之巅的一滴雨,落到北边,就会流入黄河,经由东营入渤海;落到南边,就会流入长江,经由上海入东海。

此次出差,从徽县出发,达到仇池古国——西和县,再辗转天水,最后回到徽县。沿途在秦岭西端山区穿梭,虽然没有巍峨的大山,但是区区几十公里的行程让你分分钟感觉南方和北方的差异,黄河流域和长江流域的不同。

尤其是从天水回徽县的路上,八盘山隧道的北边,车子逆着水流方向行驶,从渭河到不知名的小溪,两边的小秃山明显的黄土地貌,让我不禁想起老家的千沟万壑。过了八盘山隧道,公路沿河而下,山上绿到发黑的的树林把地表裹得严严实实,偶尔有滑坡形成的流沙像一道道伤口。

如果你是秦岭之巅的一滴雨,落到北边,就会流入黄河,经由东营入渤海;落到南边,就会流入长江,经由上海入东海。不同的命运,决定不同的生命历程。汇入黄河将见证北方的干旱,贫瘠;汇如长江将见证富饶、湿润。

我会采更多的雏菊(转)

如果我能够从头活过,

我会试着犯更多的错。

我会放松一点,

我会灵活一点。

我会比这一趟过得傻。

很少有什么事能让我当真。

我会疯狂一点。

我会很少讲究卫生,

我会冒更多的险。

我会更经常地旅游,

我会爬更多的山,

游更多的河,

看更多的日落。

我会吃更多冰淇淋,少吃豆子。

我会惹更多麻烦,

可是不在想象中担忧。

你看,我小心翼翼地稳健地理智地活着,

一个又一个小时,一天又一天。

噢,我有过难忘的时刻,

如果我能够重来一次,

我会要更多这样的时刻。

事实上,我不需要别的什么。

仅仅是时刻,一个接着一个,

而不是每天都操心着往后的漫长日子。

我曾经不论到哪里去都不会忘记带上

温度计、热水壶、漱口杯,雨衣和降落伞。

如果我能够重来一次,

我会到处走走,

什么都试试,并且轻装上路。

如果我能够从头活过,

我会延长打赤脚的时光,

从尽早的春天到尽晚的秋天。

我会更经常地逃学,

我不会考那么高的分数,

除非是一不小心。

我会多骑些旋转木马。

我会采更多的雏菊。

——纳丁·斯待尔,时年87岁

最近再看《你的生命有什么可能》,中间关于生活、兴趣和价值观谈的非常有见地,特摘抄附诗以记之。

Spring和play framework整合

play framework打破了web开发中容器的概念,默认支持RESTful,快速开发、部署,感觉不错。缺憾的是IOC得依靠其他框架支持,spring当之无愧啊,废话不说,上手操作。

背景介绍:window平台,play2.2.3,Spring3.1,java语言

一、引入Spring容器

play快速入门请移步http://www.playframework.com/documentation/2.3.x/JavaTodoList

原始的play项目结构如下:

QQ图片20140514205658




创建Global类作为Spring容器的bootstrap,

PS:类型必须是Global,且只能放到default package下,攻破技能尚未修炼。

代码如下:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import play.Application;
import play.GlobalSettings;

public class Global extends GlobalSettings {
/**

  • Spring容器
    */
    private ApplicationContext context;

@Override
public void onStart(Application arg0) {
//初始化Spring容器
context = new ClassPathXmlApplicationContext(“applicationContext.xml”);
}

@Override
public <A> A getControllerInstance(Class<A> clazz) throws Exception {
//根据类型获取控制器
return context.getBean(clazz);
}

}

二、Spring容器配置

我用的是注解配置,简单不述,代码如下:

Controller层:

package controllers.user;

import javax.annotation.Resource;

import play.Logger;
import play.data.DynamicForm;
import play.data.Form;
import play.libs.Json;
import play.mvc.Controller;
import play.mvc.Result;
import services.user.UserService;

import com.fasterxml.jackson.databind.node.ObjectNode;

@org.springframework.stereotype.Controller
public class UserController extends Controller {
@Resource(name = “userServiceImpl”)
private UserService userService;

/**

  • 登陆<p>
  • 用户名和密码正确则跳转到index.html,否则返回给客户端json形式的结果。
  • @return
    */
    public Result login() {
    try {
    DynamicForm requestData = Form.form().bindFromRequest();
    String username = requestData.get(“username”);
    String password = requestData.get(“password”);
    if (userService.check(username, password)) {
    return redirect(“/index.html”);
    } else {
    ObjectNode result = Json.newObject();
    result.put(“status”, “KO”);
    result.put(“message”, “用户名或者密码错误”);
    return ok(result);
    }
    } catch (Exception e) {
    Logger.error(“登录失败”, e);
    return badRequest();
    }
    }
    }

Service层:

package services.user.impl;

import org.springframework.stereotype.Service;

import services.user.UserService;

@Service(“userServiceImpl”)
public class UserServiceImpl implements UserService {
@Override
public boolean check(String username, String password) throws Exception {
return “admin”.equals(username) && “111111”.equals(password);
}
}

routes配置:

Home page

GET / @controllers.Application.index
POST /user/login @controllers.user.UserController.login

Map static resources from the /public folder to the /assets URL path

GET /*file controllers.Assets.at(path=”/public”, file)

三、访问请求

登陆页面:

<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8”>
<title>登陆页面</title>
</head>
<body>
<div>
<form action=”/user/login” method=”post”>
用户名:<input type=”text” name=”username” /><br/>
密 码:<input type=”password” name=”password” /><br/>
<input type=”submit” name=”登录” />
</form>
</div>
</body>
</html>

最后看下目录结构吧

1

 

 

 

使用ant打包实现版本持续更新

背景介绍:代码仓库是小乌龟mercurial,因为目前开发的项目迭代频率要求较高,因此需要定时自动打包发布程序。

一、在dynamic web project中添加ant build.xml,内容如下:

<?xml version=”1.0”?>
<project name=”round_server” default=”war” basedir=”.”>
<!– 申明常用变量 –>
<property name=”classes” value=”build/classes”/>
<property name=”build” value=”build”/>
<property name=”lib” value=”WebContent/WEB-INF/lib/“/>
<!– 定义编译时依赖包搜索路径 –>
<path id=”rlib”>
<fileset dir=”${lib}”>
<include name=”*.jar”/>
</fileset>
</path>
<!– 删除build路径–>
<target name=”clean”>
<delete dir=”build”/>
</target>

<!– 建立build/classes目录,并将java文件到build/classes路径下,注意指定编码格式,否则编译信息会乱码–>
<target name=”compile” depends=”clean”>
<mkdir dir=”${classes}”/>
<javac srcdir=”src” destdir=”${classes}” encoding=”UTF-8”>
<classpath refid=”rlib”></classpath>
</javac>
</target>

<!– 拷贝配置文件,如log4j.properties,config.properties和db.properties等 –>
<target name=”copy” depends=”compile”>
<copy todir=”${classes}”>
<fileset dir=”resource”/>
</copy>
</target>

<!– 打成war包–>
<target name=”war” depends=”copy”>
<war destfile=”${build}/round_server.war” webxml=”WebContent/WEB-INF/web.xml”>
<!– 拷贝WebContent下除了WEB-INF和META-INF的两个文件夹–>
<fileset dir=”WebContent” includes=”*/.jsp”/>
<!– 拷贝lib目录下的jar包–>
<lib dir=”${lib}”/>
<!– 拷贝build/classes下的class文件–>
<classes dir=”${classes}”/>
</war>
</target>
</project>

备注:将所有第三方的jar统统放到WebConten/WEB_INFO/lib文件下,包括servlet-apI.jar

二、下载并安装ant和hg

服务器为debian,安装操作如下:

安装ant

apt-get install ant

安装hg

apt-get install mercurial

三、克隆代码并使用ant编译打包

cd /home/hg/repos

hg clone http://ip:port//repos/round_server

cd round_server

ant -f build.xml

至此文件打包完成,根据第一步骤的配置,war文件被生成到build目录下,接下来将文件拷贝到tomcat下,重启服务器,一次打包成功完成。

四、定时任务配置

将上述命令变成脚本:

vi deploy-round.sh

cd /home/hg/repos/round_server

hg update

ant -f build.xml

cp build/round_server.war /var/lib/tomcat/webapps/

/etc/init.d/tomcat restart

完成编辑,将文件编辑成可执行文件

chmod 755 deploy-round.sh

加入linux定时计划

crontab -e

键入 0 1 ? /home/deploy-round.sh > /dev/null

保存退出

Postgres常用函数

–查询序列号

select ROW_NUMBER() OVER(ORDER BY score DESC) from cust_basic_info

–查询序列号

select  ROW_NUMBER() OVER() sn , t1.* from _user t1;

 

–日期间隔计算

date_part(‘day’, (now() -stocktime)) <=3

 

–类型转换

select CAST (1234 AS text)

 

–日期变更

select timestamp ‘20131219’ + interval ‘3 month’

select now() + interval ‘3 month’

–手动增加 check约束和外键约束

alter table message add CONSTRAINT check_message_active CHECK (msg_type in(0,1))

alter table message add CONSTRAINT foreign_key_message_dialog_id foreign key(dialog_id) REFERENCES dialog(id)

—替换

update goods_pic set goodspicurl = overlay(goodspicurl placing ‘110’ from 18 for 2) 

–创建用户

createuser -drSP round_server

mybatis配置第三方连接池

mybatis配置JDBCPool连接池,废话不说,直接上文。

1.创建一个自己的数据源工厂类实现 org.apache.ibatis.datasource.DataSourceFactory

添加属性

注意属性要用连接池提供的数据源对象:

org.apache.tomcat.jdbc.pool.DataSource dataSource;



Java代码

  1. /**
    • JDBCPOOL的实现类
  2. *
    • @author Frank
    • @date 2013-1-5 JDBCPoolDataSourceFactory.java
  3. */
  4. public class JDBCPoolDataSourceFactory implements DataSourceFactory {
  5. private static final String DRIVER_PROPERTY_PREFIX = “driver.”;
    9.10. private static final int DRIVER_PROPERTY_PREFIX_LENGTH = DRIVER_PROPERTY_PREFIX.length();
    11.12. // 定义数据源
  6. private DataSource dataSource;
    14.15.16.17. /**
    • 构造器
  7. */
  8. public JDBCPoolDataSourceFactory() {
  9. dataSource = new DataSource();
  10. }
    23.24.25.26. /**
    • 获取JDBCPOOL数据源
  11. */
  12. @Override
  13. public DataSource getDataSource() {
  14. return dataSource;
  15. }
    33.34.35.36. /**
    • 对JDBCPOOL属性值进行设置
  16. */
  17. @Override
  18. public void setProperties(Properties properties) {
  19. // 设置数据库驱动类名称
  20. Properties driverProperties = new Properties();
  21. MetaObject metaDataSource = MetaObject.forObject(dataSource);
  22. for (Object key : properties.keySet()) {
  23. String propertyName = ( String ) key;
  24. if (propertyName.startsWith(DRIVER_PROPERTY_PREFIX)) {
  25. String value = properties.getProperty(propertyName);
  26. driverProperties.setProperty(propertyName.substring(DRIVER_PROPERTY_PREFIX_LENGTH), value);
  27. } else if (metaDataSource.hasSetter(propertyName)) {
  28. String value = ( String ) properties.get(propertyName);
  29. Object convertedValue = convertValue(metaDataSource, propertyName, value);
  30. metaDataSource.setValue(propertyName, convertedValue);
  31. } else {
  32. throw new DataSourceException(“Unknown DataSource property: “ + propertyName);
  33. }
  34. }
  35. if (driverProperties.size() > 0) {
  36. metaDataSource.setValue(“driverProperties”, driverProperties);
  37. }
  38. }
    61.62.63.64. private Object convertValue(MetaObject metaDataSource, String propertyName, String value) {
  39. Object convertedValue = value;
  40. Class< ? > targetType = metaDataSource.getSetterType(propertyName);
  41. if (targetType == Integer.class || targetType == int.class) {
  42. convertedValue = Integer.valueOf(value);
  43. } else if (targetType == Long.class || targetType == long.class) {
  44. convertedValue = Long.valueOf(value);
  45. } else if (targetType == Boolean.class || targetType == boolean.class) {
  46. convertedValue = Boolean.valueOf(value);
  47. }
  48. return convertedValue;
  49. }

2.完成mybatis数据源配置文件mybatis-config.xml

<?xml version=”1.0” encoding=”UTF-8”?>



Xml代码

  1. <!DOCTYPE configuration
  2. PUBLIC “-//mybatis.org//DTD Config 3.0//EN”
  3. http://mybatis.org/dtd/mybatis-3-config.dtd"&gt;
  4. <configuration>
  5. <environments default=”development”>
  6. <environment id=”development”>
  7. <transactionManager type=”JDBC”/>
  8. <dataSource type=”com.shdy.db.JDBCPoolDataSourceFactory”>
  9. <property name=”driverClassName” value=”oracle.jdbc.driver.OracleDriver”/>
  10. <property name=”url” value=”jdbc:oracle:thin:@10.21.17.11:1521:XX”/>
  11. <property name=”username” value=”XXXX”/>
  12. <property name=”password” value=”XXXX”/>
  13. <property name=”testWhileIdle” value=”true” />
  14. <property name=”testOnBorrow” value=”true” />
  15. <property name=”testOnReturn” value=”false” />
  16. <property name=”validationQuery” value=”SELECT 1 FROM SYSIBM.SYSDUMMY1” />
  17. <property name=”validationInterval” value=”30000” />
  18. <property name=”timeBetweenEvictionRunsMillis” value=”30000” />
  19. <property name=”maxActive” value=”50” />
  20. <property name=”maxIdle” value=”30” />
  21. <property name=”minIdle” value=”10” />
  22. <property name=”maxWait” value=”5000” />
  23. <property name=”initialSize” value=”5” />
  24. <property name=”removeAbandonedTimeout” value=”36000” />
  25. <property name=”removeAbandoned” value=”true” />
  26. <property name=”logAbandoned” value=”true” />
  27. <property name=”minEvictableIdleTimeMillis” value=”30000” />
  28. <property name=”jmxEnabled” value=”true” />
  29. <property name=”jdbcInterceptors”
  30. value=”org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer” />
    31.32. </dataSource>
  31. </environment>
  32. </environments>
  33. <mappers>
  34. <mapper resource=”com/shdy/db/sql/User.xml”/>
  35. </mappers>
  36. </configuration>

注意: <property name=”driverClassName” value=”oracle.jdbc.driver.OracleDriver”/>