http://java.sun.com/docs/books/tutorial/jmx/remote/custom.html
非常不错的实例.
很齐全,比国内网络上断章取义的文章好的多。
/** * @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; } }
稍微总结下了目前项目中CRM通过ESB与其他系统交互时关于同步异步选择的问题。
同步和异步都是接口交互的一种模式,也可以理解成数据交互的方式。
同步:CRM通过ESB与外部系统直接连接保持不断,直至外部系统返回接口或状态此连接方结束。已知同步接口:查号、选号、选址、锁号…
返回结果在同一接口返回
优点:实时性强。速度块。容错性强。
缺点:高峰时易造成网络堵塞。或当外部系统故障时因无法返回结果而导致业务不能持续。
异步:CRM只和ESB实时交互,即CRM数据送达ESB后就返回,CRM继续完成后续操作。ESB会把数据在空闲的时间(网络空闲)发送给其他系统。已知异步接口:创建客账户、订单送OSS…
返回结果需一个新接口返回
优点:合理应用网络资源不易对外部系统造成堵塞现象。外部系统故障时,数据仍旧保留在ESB中,直到系统恢复。
缺点:实时性查。速度较慢。容错性差(外部系统故障时CRM不会感知)。如果需要返回接口需另外提供新接口。
特别选择同步还是异步请各位从生产环境考虑,在对业务影响不大的情况下建议采用异步的方式。如有疑问与我交流。
原文:http://www.javaeye.com/topic/569993
对于常见业务方法返回List对象时一般有二种方法:
1、返回含数据的数据的List对象,该对象可能为空
2、返回null
如下方法:
一般使用时,
这时候list都将具体指向一个内存,如果返回值为空时,list指向一个null的空内存,这时我们又要对list进行是否为null进行判断,量大时就可能对程序造成瓶颈。文章作者的解决方法是用Collections工具类的empty系列静态方法解决。
既如下代码:
此时如果为空返回的list将不存在为null的可能,并且empty系列方法是静态方法,所有引用都指向静态内存,不会生产和占用新的资源。不失为一个好的方法。
我们也可以自己编写自己的empty静态类,既每次都返回为空的静态的List、Map….对象。
我自己的一些理解,详细情况请大家访问原文和作者交流。
“很感谢您能抽时间了解怡帆的事情,怡帆是我四岁的女儿,患有肺动脉高压,需要二十四小时吸氧来维持呼吸,北京儿童医院诊断为肺纤维化,国内无法医治。在和睦家医院亚历山大医生的全力帮助下,怡帆有机会去美国德州儿童医院接受心肺移植手术,费用十分昂贵,作为孩子的父母,我们没有足够的时间来积累这笔费用,为此,和睦家基金会帮助我们建立了怡帆基金,寻求社会的帮助,请您抽出少量的时间浏览www.yifanfund.com,同时将这个网站告诉您周围的朋友,并恳请提供一些帮助来挽救这个孩子。谢谢!”
上面的话来自怡帆的父亲 我们的朋友潘俊廷,一位在嵌入式领域特别是ARM/Linux领域做开发工作多年的工程师,一位Linux AKA论坛的活跃分子。从潘俊廷的一段话可以看出一位为IT行业工作多年的北京外地工程师的无奈。
地址 北京市海淀区中关村西区善缘街1号3-107 电话 010-62416420 13910962662
怡帆的故事
如果不是因为失去了呼吸与行走的自由,即将迎来5岁生日的潘怡帆就可以像其他小朋友一样,在阳光下奔跑,呼吸自由的空气。
在她模糊的记忆里,最大的愿望是得到一双漂亮的旱冰鞋,有一天能够穿上它,自由地起舞。可是,生活留给她更多的,是无数个针头与面罩的记忆,每一个夜晚,她幼小的双手紧紧地护着氧气面罩,害怕失去这唯一维系她生命的纽带。
从来到这个新世界的第二天起,她立刻被送进急救病房,接受胸腔穿刺手术,她的呼吸出了问题,经过15天的治疗,终于回到家中和父母在一起。
她第二次入院是一岁零二个月,那时还不会走路,甚至连爬行也不会,那次是因为间质性肺炎,由于怀疑肺泡蛋白沉积,她的肺被灌洗过两次,18天后,医院放弃了对她的治疗,除了她的父母。
接她回家的时候,她的嗓子完全嘶哑,除了看到她张嘴哭泣,听不到一丁点声音。小怡帆到底出了什么问题,她的父母不知道,他们只能卖掉唯一的房子,通过多方途径尽他们的全力来帮助孩子获得健康。
他们给她配置氧气机,让她枯竭的肺得到充足的氧气,勇敢的小怡帆终于挺过那段艰难的日子,慢慢地恢复到自主呼吸状态,在她三岁的时候,可以扶着凳子挪动了。
如果一切能够延续,生命之花定将如期绽放,但是,命运之神只给了她一年的时间,她还来不及学会独立地行走,她的肺已经不能供给身体足够的氧气,正在向纤维化方向发展,需要全天带着氧气面罩帮助呼吸,行走的努力不得已终止,任何有氧活动都会给她的肺带来巨大的压力。
从那时候起,她离开氧气机的距离不超过一根三米空心送气管的长度,她的全部生活内容来源于电视,她喜欢看动画片,和动画片里面的角色一起笑,一起哭,她也逐渐懂得,什么是善良,什么是美丽,什么是勇敢,当她从电视里看到在四川地震中的很多小朋友失去了他们的家园,她知道他们更需要帮助。现在,她保存着红十字会写给她的感谢信,那是她的骄傲。
她有一个梦想,有一天能够自由地呼吸与行走,穿上漂亮的旱冰鞋,自由地起舞。
我们诚挚的邀请您加入我们,救助可爱的小怡帆。凡救一人,即救世界。
如果您想帮助怡帆,请通过支付宝或银行账号进行捐赠:
怡帆基金支付宝账户:yifanfoundation@gmail.com
怡帆妈妈农业银行账户:
户名:周萍
账号:6228480010211053011
开户行:中国农业银行北京市分行白石桥支行
本人已经捐了点款,虽然数额不多但也是一份心意,这应该是真实的故事(我们这个社会已经不能容下太多的欺骗了,早10年前大家遇到这种事情一定不会怀疑,可是现在呢?),望各位好友能献上一份爱心,特别是广大IT同志们,谢谢!
最近,因工作需要对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(); } }
周末这两天闲来无事做,无意间看到有贴关于如何搭建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.sql和GEAsql-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练练手~
SVN:http://fengproject.googlecode.com/svn/trunk/fenghome/
功能比较简单,但是包含了django框架的方方面面。
功能:
1、基本的文章管理。采用django的admin管理系统,这也是django一大特色。
2、评论。发布文章时,可控制的允许是否评论,以及对评论管理。
3、模板系统。可以自定义模板,可在setting.py里设置。当然目前就做一套模板。
4、国际化。全站所有字符串都采用国际化设置,目前只做了英汉2种。
前前后后断断续续做了7个晚上。这对于django的快速开发来说效率不算高,还算是低下!
近期评论