作者存档: fred - 第10页

Creating a Custom JMX Client

http://java.sun.com/docs/books/tutorial/jmx/remote/custom.html

非常不错的实例.

很齐全,比国内网络上断章取义的文章好的多。

分享一个不错的分页Bean

/**
				* @author Fred Zhu
				* 分页辅助工具
				*/
				public class PageBean {

				private int currentPage = 1;// 当前页数
				private int totalPages = 0;// 总页数
				private int pageSize = 0;// 每页显示数
				private int totalRows = 0;// 总数据数
				private int startNum = 0;// 开始记录
				private int endNum = pageSize;//结束记录
				private int nextPage = 0;// 下一页
				private int previousPage = 0;// 上一页
				private boolean hasNextPage = false;// 是否有下一页
				private boolean hasPreviousPage = false;// 是否有前一页

				public PageBean(int pageSize, int currentPage, int totalRows) {

				this.pageSize = pageSize;
				this.currentPage = currentPage;
				this.totalRows = totalRows;

				//计算总页数
				if ((totalRows % pageSize) == 0) {
				totalPages = totalRows / pageSize;
				} else {
				totalPages = totalRows / pageSize + 1;
				}

				//是否有下一页
				if (currentPage >= totalPages) {
				hasNextPage = false;
				currentPage = totalPages;
				} else {
				hasNextPage = true;
				}

				//是否有上一页
				if (currentPage <= 1) {
				hasPreviousPage = false;
				currentPage = 1;
				} else {
				hasPreviousPage = true;
				}

				startNum = (currentPage - 1) * pageSize;//开始记录数

				if(totalPages-currentPage<1){
				endNum = totalRows;
				}else{
				endNum = currentPage*pageSize;
				}

				nextPage = currentPage + 1;//下一页页码

				previousPage = currentPage - 1;//上一页页码

				if (nextPage >= totalPages) {
				nextPage = totalPages;
				}

				if (previousPage <= 1) {
				previousPage = 1;
				}

				}

				public void refresh(int currentPage){
				this.currentPage = currentPage;
				startNum = (currentPage - 1) * pageSize;
				if(totalPages-currentPage<1){
				endNum = totalRows;
				}else{
				endNum = currentPage*pageSize;
				}
				}

				public boolean isHasNextPage() {

				return hasNextPage;

				}

				public boolean isHasPreviousPage() {

				return hasPreviousPage;

				}

				/**
				* @return the nextPage
				*/
				public int getNextPage() {
				return nextPage;
				}

				/**
				* @param nextPage
				*             the nextPage to set
				*/
				public void setNextPage(int nextPage) {
				this.nextPage = nextPage;
				}

				/**
				* @return the previousPage
				*/
				public int getPreviousPage() {
				return previousPage;
				}

				/**
				* @param previousPage
				*             the previousPage to set
				*/
				public void setPreviousPage(int previousPage) {
				this.previousPage = previousPage;
				}

				/**
				* @return the currentPage
				*/
				public int getCurrentPage() {
				return currentPage;
				}

				/**
				* @param currentPage
				*             the currentPage to set
				*/
				public void setCurrentPage(int currentPage) {
				this.currentPage = currentPage;
				}

				/**
				* @return the pageSize
				*/
				public int getPageSize() {
				return pageSize;
				}

				/**
				* @param pageSize
				*             the pageSize to set
				*/
				public void setPageSize(int pageSize) {
				this.pageSize = pageSize;
				}

				/**
				* @return the totalPages
				*/
				public int getTotalPages() {
				return totalPages;
				}

				/**
				* @param totalPages
				*             the totalPages to set
				*/
				public void setTotalPages(int totalPages) {
				this.totalPages = totalPages;
				}

				/**
				* @return the totalRows
				*/
				public int getTotalRows() {
				return totalRows;
				}

				/**
				* @param totalRows
				*             the totalRows to set
				*/
				public void setTotalRows(int totalRows) {
				this.totalRows = totalRows;
				}

				/**
				* @param hasNextPage
				*             the hasNextPage to set
				*/
				public void setHasNextPage(boolean hasNextPage) {
				this.hasNextPage = hasNextPage;
				}

				/**
				* @param hasPreviousPage
				*             the hasPreviousPage to set
				*/
				public void setHasPreviousPage(boolean hasPreviousPage) {
				this.hasPreviousPage = hasPreviousPage;
				}

				/**
				* @return the startNum
				*/
				public int getStartNum() {
				return startNum;
				}

				/**
				* @param startNum
				*             the startNum to set
				*/
				public void setStartNum(int startNum) {
				this.startNum = startNum;
				}

				public int getEndNum() {
				return endNum;
				}

				public void setEndNum(int endNum) {
				this.endNum = endNum;
				}
				}

ESB同步,异步选择,从项目实际出发(电信)

稍微总结下了目前项目中CRM通过ESB与其他系统交互时关于同步异步选择的问题。

同步和异步都是接口交互的一种模式,也可以理解成数据交互的方式。

 

同步:CRM通过ESB与外部系统直接连接保持不断,直至外部系统返回接口或状态此连接方结束。已知同步接口:查号、选号、选址、锁号…

 

 

        返回结果在同一接口返回

优点:实时性强。速度块。容错性强。

 

缺点:高峰时易造成网络堵塞。或当外部系统故障时因无法返回结果而导致业务不能持续。

 

 

异步:CRM只和ESB实时交互,即CRM数据送达ESB后就返回,CRM继续完成后续操作。ESB会把数据在空闲的时间(网络空闲)发送给其他系统。已知异步接口:创建客账户、订单送OSS…

              

                返回结果需一个新接口返回

优点:合理应用网络资源不易对外部系统造成堵塞现象。外部系统故障时,数据仍旧保留在ESB中,直到系统恢复。

缺点:实时性查。速度较慢。容错性差(外部系统故障时CRM不会感知)。如果需要返回接口需另外提供新接口。

 

 

特别选择同步还是异步请各位从生产环境考虑,在对业务影响不大的情况下建议采用异步的方式。如有疑问与我交流。

性能瓶颈-项目中List的返回值

原文:http://www.javaeye.com/topic/569993

对于常见业务方法返回List对象时一般有二种方法:

1、返回含数据的数据的List对象,该对象可能为空

2、返回null

如下方法:

public List returnArray2(Object data){
if(data != null){
return (List) data;
}
return null;
}

一般使用时,

List list = xxxx.returnArray2(data);

这时候list都将具体指向一个内存,如果返回值为空时,list指向一个null的空内存,这时我们又要对list进行是否为null进行判断,量大时就可能对程序造成瓶颈。文章作者的解决方法是用Collections工具类的empty系列静态方法解决。

既如下代码:

public List returnArray2(Object data){
if(data == null){
return Collections.emptyList();
}
return (List) data;
}

此时如果为空返回的list将不存在为null的可能,并且empty系列方法是静态方法,所有引用都指向静态内存,不会生产和占用新的资源。不失为一个好的方法。

我们也可以自己编写自己的empty静态类,既每次都返回为空的静态的List、Map….对象。

我自己的一些理解,详细情况请大家访问原文和作者交流。

凡救一人,即救世界

救救小怡帆:IT白领倾家难救4岁绝症女儿

“很感谢您能抽时间了解怡帆的事情,怡帆是我四岁的女儿,患有肺动脉高压,需要二十四小时吸氧来维持呼吸,北京儿童医院诊断为肺纤维化,国内无法医治。在和睦家医院亚历山大医生的全力帮助下,怡帆有机会去美国德州儿童医院接受心肺移植手术,费用十分昂贵,作为孩子的父母,我们没有足够的时间来积累这笔费用,为此,和睦家基金会帮助我们建立了怡帆基金,寻求社会的帮助,请您抽出少量的时间浏览www.yifanfund.com,同时将这个网站告诉您周围的朋友,并恳请提供一些帮助来挽救这个孩子。谢谢!”

上面的话来自怡帆的父亲 我们的朋友潘俊廷,一位在嵌入式领域特别是ARM/Linux领域做开发工作多年的工程师,一位Linux AKA论坛的活跃分子。从潘俊廷的一段话可以看出一位为IT行业工作多年的北京外地工程师的无奈。

地址 北京市海淀区中关村西区善缘街1号3-107 电话 010-62416420 13910962662

怡帆的故事

如果不是因为失去了呼吸与行走的自由,即将迎来5岁生日的潘怡帆就可以像其他小朋友一样,在阳光下奔跑,呼吸自由的空气。

在她模糊的记忆里,最大的愿望是得到一双漂亮的旱冰鞋,有一天能够穿上它,自由地起舞。可是,生活留给她更多的,是无数个针头与面罩的记忆,每一个夜晚,她幼小的双手紧紧地护着氧气面罩,害怕失去这唯一维系她生命的纽带。

从来到这个新世界的第二天起,她立刻被送进急救病房,接受胸腔穿刺手术,她的呼吸出了问题,经过15天的治疗,终于回到家中和父母在一起。

她第二次入院是一岁零二个月,那时还不会走路,甚至连爬行也不会,那次是因为间质性肺炎,由于怀疑肺泡蛋白沉积,她的肺被灌洗过两次,18天后,医院放弃了对她的治疗,除了她的父母。

接她回家的时候,她的嗓子完全嘶哑,除了看到她张嘴哭泣,听不到一丁点声音。小怡帆到底出了什么问题,她的父母不知道,他们只能卖掉唯一的房子,通过多方途径尽他们的全力来帮助孩子获得健康。

他们给她配置氧气机,让她枯竭的肺得到充足的氧气,勇敢的小怡帆终于挺过那段艰难的日子,慢慢地恢复到自主呼吸状态,在她三岁的时候,可以扶着凳子挪动了。

如果一切能够延续,生命之花定将如期绽放,但是,命运之神只给了她一年的时间,她还来不及学会独立地行走,她的肺已经不能供给身体足够的氧气,正在向纤维化方向发展,需要全天带着氧气面罩帮助呼吸,行走的努力不得已终止,任何有氧活动都会给她的肺带来巨大的压力。


从那时候起,她离开氧气机的距离不超过一根三米空心送气管的长度,她的全部生活内容来源于电视,她喜欢看动画片,和动画片里面的角色一起笑,一起哭,她也逐渐懂得,什么是善良,什么是美丽,什么是勇敢,当她从电视里看到在四川地震中的很多小朋友失去了他们的家园,她知道他们更需要帮助。现在,她保存着红十字会写给她的感谢信,那是她的骄傲。

她有一个梦想,有一天能够自由地呼吸与行走,穿上漂亮的旱冰鞋,自由地起舞。

我们诚挚的邀请您加入我们,救助可爱的小怡帆。凡救一人,即救世界。

如果您想帮助怡帆,请通过支付宝或银行账号进行捐赠:
怡帆基金支付宝账户:yifanfoundation@gmail.com
怡帆妈妈农业银行账户:
户名:周萍
账号:6228480010211053011
开户行:中国农业银行北京市分行白石桥支行

本人已经捐了点款,虽然数额不多但也是一份心意,这应该是真实的故事(我们这个社会已经不能容下太多的欺骗了,早10年前大家遇到这种事情一定不会怀疑,可是现在呢?),望各位好友能献上一份爱心,特别是广大IT同志们,谢谢!

WSO2 ESB 相关教程

1、使用 Apache Synapse 将现有的系统转化为 SOA 平台 (原版)

2、Apache Synapse Quick Start Guide

3、WSO2 Enterprise Service Bus

Python&Django视频-台湾辅仁大学

比较少见中文的Python&Django视频,出自台湾著名学府辅仁大学。

SkyDrive链接

电驴同样能搜到,但担心电驴资料失效,特在此备份一处。

希望能跟Python爱好者一起交流。

ActiveMq简单示例

最近,因工作需要对JMS进行了些了解和学习。不敢藏私,把些许经验和大家分享下,顺带自己也总结下,如有不足请指出。学习ActiveMq首先要对JMS规范有所了解。

JMS教程 这篇文章介绍的挺不错,虽然也是转载的不过好在排版还可以!呵呵!

要进行ActiveMq的开发,除了对概念要有所了解外,还要对JMS常用的接口有所了解,上面文档里也有描述。

下面2个程序,一个是向ActiveMq发送JMS消息,另一个是从ActiveMq里读取JMS消息!

package cn.fengsage.jms;

import java.util.Hashtable;

import javax.jms.*;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
* @author Fred Zhu
*
*/
public class SenderTest {

private static final String DistDestQueName = "test";
private static final String JMS_FACTORY = "ConnectionFactory";

private Context jndiContext = null;
private QueueConnectionFactory qconFactory = null;
private QueueConnection qconn = null;
private QueueSession qsession = null;
private Queue queueDest = null;
private QueueSender qsender = null;

public void sendMessage(String msg) throws NamingException, JMSException {
jndiContext = this.getJndiContext();
qconFactory = (QueueConnectionFactory) jndiContext.lookup(JMS_FACTORY);
qconn = qconFactory.createQueueConnection();
qsession = qconn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queueDest = (Queue) jndiContext.lookup(DistDestQueName);
qsender = qsession.createSender(queueDest);
TextMessage objMsg = null;
objMsg = qsession.createTextMessage();
qconn.start();
objMsg.setText(msg);
qsender.send(objMsg);
qconn.close();
qsender.close();

}

private Context getJndiContext() throws NamingException {
Hashtable properties = new Hashtable();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
properties.put(Context.PROVIDER_URL, "tcp://localhost:61616");
return new InitialContext(properties);
}

public static void main(String[] args) throws NamingException, JMSException {
SenderTest test = new SenderTest();
test.sendMessage("jms test");

}
}

package cn.fengsage.jms;

import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
* @author Fred Zhu
*
*/
public class ReceiveTest {
private static final String DistDestQueName = "test";
private static final String JMS_FACTORY = "ConnectionFactory";

private Context jndiContext = null;
private QueueConnectionFactory qconFactory = null;
private QueueConnection qconn = null;
private QueueSession qsession = null;
private Queue queueDest = null;
private QueueReceiver qreceiver = null;

public void reveiveMessage() throws NamingException, JMSException {
jndiContext = this.getJndiContext();
qconFactory = (QueueConnectionFactory) jndiContext.lookup(JMS_FACTORY);
qconn = qconFactory.createQueueConnection();
qsession = qconn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queueDest = (Queue) jndiContext.lookup(DistDestQueName);
qreceiver = qsession.createReceiver(queueDest);
qconn.start();
TextMessage message = (TextMessage) qreceiver.receive();
System.out.println(message.getText());
qconn.close();

}

private Context getJndiContext() throws NamingException {
Hashtable properties = new Hashtable();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
properties.put(Context.PROVIDER_URL, "tcp://localhost:61616");
return new InitialContext(properties);
}

public static void main(String[] args) throws NamingException, JMSException {
ReceiveTest test = new ReceiveTest();
test.reveiveMessage();
}
}

补充个官方的例子:http://activemq.apache.org/jndi-support.html

RO-linux私服架设

周末这两天闲来无事做,无意间看到有贴关于如何搭建RO私服,突然有了兴趣。本人这些年就爱玩2个网游《石器时代》和《仙境传说》。当年都曾辉煌一时,然后现在时光不再,前者已经关了,后者在盛大的摧残下已经面目全非了!

我用的是GEA的服务端 官方地址:http://gs-zone.cn/

win下安装没啥难度,因此这里就pass了,我用的是 GEA 中文服务端v1.F2.0716.13950 fix2 for Linux

说下一般私服的组成: 1、注册页  2、数据库 3、服务端  关键在于数据库和服务端

我选择的操作系统是debian,其强大性随便googe下就知道了!

因为是linux系统,因此这里用phpmyadmin操作数据库!而这个前提又是要安装好apache|ngix、php5这些web容器和脚本。

最佳的步骤如下:   debian出色的apt命令,几行完成安装
1、apt-get install apache2                           安装apache2
2、apt-get install php5                                 安装php5解释器
3、apt-get install mysql-server-5.0               安装mysql5.0,这个版本必须使用5.0如果找不到换源
4、apt-get install libapache2-mod-php5       安装apache_mod
5、apt-get install php5-gd
6、apt-get install php5-dom
7、apt-get install php5-pgsql
8、apt-get install php5-mysql
9、apt-get install phpmyadmin                    安装phpmyadmin管理工具,这个必须放在最后做,不然会很麻烦
OK~~打开IE输入  http://ip/phpmyadmin 查看能不能登陆管理MySQL。成功的话依次建立2个数据库(数据库名可以乱取),并依次导入GEAsql-filesmain.sqlGEAsql-fileslog.sql

OK~~私服搭建前2步完成了!现在配置下服务端,只要配置GEAconfinter_athena.conf

// Global SQL settings
// overriden by local settings when the hostname is defined there
// (currently only the login-server reads/obeys these settings)
sql.db_hostname: 127.0.0.1
sql.db_port: 3306
sql.db_username: root
sql.db_password: root
sql.db_database: gamedb
sql.codepage:

// MySQL Character SQL server
char_server_ip: 127.0.0.1
char_server_port: 3306
char_server_id: root
char_server_pw: root
char_server_db: gamedb

// MySQL Map SQL Server
map_server_ip: 127.0.0.1
map_server_port: 3306
map_server_id: root
map_server_pw: root
map_server_db: gamedb

// MySQL Log SQL Database
log_db_ip: 127.0.0.1
log_db_port: 3306
log_db_id: root
log_db_pw: root
log_db_db: gamelog
log_codepage:

主要配置的是数据库连接用户和前面增加的数据库名称!

最后~~运行./athena-start 就OK了·~

补充一点:由于./atnena-stop有时不能自觉结束进程,因此需要强行解除进程,如下:

#!/bin/sh
# Athena Stop

echo “GeAthena Stoping…”
killall -9 LoginServer&
killall -9 CharServer&
killall -9 MapServer&
echo “GeAthena Stoped…”

如果熟悉mysql环境的,刚才步骤的1-9只要做其中的第三步创建一个mysql5.0的服务器就可以了,其他步骤只是为了安装phpmyadmin方便可视化管理数据库。当然正式开服还需要一个注册页所以这些步骤仍旧需要。

总结下,其实搭建RO的私服就2步,一是建立数据库,二是启动服务端。

django blog 系统

这段时间复习了django的一些知识。拿来做个blog练练手~

SVN:http://fengproject.googlecode.com/svn/trunk/fenghome/

功能比较简单,但是包含了django框架的方方面面。

功能:

1、基本的文章管理。采用django的admin管理系统,这也是django一大特色。

2、评论。发布文章时,可控制的允许是否评论,以及对评论管理。

3、模板系统。可以自定义模板,可在setting.py里设置。当然目前就做一套模板。

4、国际化。全站所有字符串都采用国际化设置,目前只做了英汉2种。

前前后后断断续续做了7个晚上。这对于django的快速开发来说效率不算高,还算是低下!