﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-庄周梦蝶-随笔分类-my open-source</title><link>http://www.blogjava.net/killme2008/category/20771.html</link><description>生活、程序、未来</description><language>zh-cn</language><lastBuildDate>Thu, 11 Dec 2014 01:02:38 GMT</lastBuildDate><pubDate>Thu, 11 Dec 2014 01:02:38 GMT</pubDate><ttl>60</ttl><item><title>Another URL Shortener using NodeJS</title><link>http://www.blogjava.net/killme2008/archive/2012/11/25/391936.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sun, 25 Nov 2012 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2012/11/25/391936.html</guid><description><![CDATA[It's my weekend project&#8212;&#8212;node-shorten: URL Shortener just like t.cn,goo.gl etc.<br />
<br />
Is is written in&nbsp;<a href="http://nodejs.org/">NodeJS</a>,using <a href="http://expressjs.com/">express.js</a> for MVC framework,and using MySQL for storage and Redis for caching.<br />
<br />
A demo online: <a href="http://fnil.me/">http://fnil.me/</a><br />
<br />
The project is at <a href="https://github.com/killme2008/node-shorten">https://github.com/killme2008/node-shorten</a><br />
<br />
Feel free to modify and use it.Have fun.<img src ="http://www.blogjava.net/killme2008/aggbug/391936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2012-11-25 20:31 <a href="http://www.blogjava.net/killme2008/archive/2012/11/25/391936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ring.velocity:render velocity templates for ring in clojure</title><link>http://www.blogjava.net/killme2008/archive/2012/07/18/383354.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 17 Jul 2012 16:07:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2012/07/18/383354.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/383354.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2012/07/18/383354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/383354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/383354.html</trackback:ping><description><![CDATA[<h1></h1><span style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">Home:&nbsp;</span><a href="https://github.com/killme2008/ring.velocity" style="font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">https://github.com/killme2008/ring.velocity<br /></a><br /><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">A Clojure library designed to render velocity template for ring in clojure.<br /></p><h2><a name="usage" href="https://github.com/killme2008/ring.velocity#usage" style="margin: 0px 0px 0px -30px; padding: 0px 0px 0px 30px; border: 0px; color: rgb(65, 131, 196); text-decoration: none; display: block; cursor: pointer; position: absolute; top: 0px; left: 0px; bottom: 0px; "></a>Usage</h2><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">Adds dependency in leiningen project.clj:</p><pre style="margin-top: 15px; margin-bottom: 15px; padding: 6px 10px; border: 1px solid #cccccc; font-size: 13px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: #f8f8f8; line-height: 19px; overflow: auto; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; color: #333333; "><code style="margin: 0px; padding: 0px; border: none; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; ">  [ring.velocity "0.1.0-SNAPSHOT"] </code></pre><p style="margin: 15px 0px; padding: 0px; border: 0px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">Create a directory named&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; ">templates</code>&nbsp;in your project directory to keep all velocity templates.</p><p style="margin: 15px 0px; padding: 0px; border: 0px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">Create a template&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; ">templates/test.vm</code>:</p><pre style="margin-top: 15px; margin-bottom: 15px; padding: 6px 10px; border: 1px solid #cccccc; font-size: 13px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: #f8f8f8; line-height: 19px; overflow: auto; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; color: #333333; "><code style="margin: 0px; padding: 0px; border: none; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; ">  hello,$name,your age is $age. </code></pre><p style="margin: 15px 0px; padding: 0px; border: 0px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">Use ring.velocity in your namespace:</p><pre style="margin-top: 15px; margin-bottom: 15px; padding: 6px 10px; border: 1px solid #cccccc; font-size: 13px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: #f8f8f8; line-height: 19px; overflow: auto; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; color: #333333; "><code style="margin: 0px; padding: 0px; border: none; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; ">  (use '[ring.velocity.core :only [render]]) </code></pre><p style="margin: 15px 0px; padding: 0px; border: 0px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">Use&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; ">render</code>&nbsp;function to render template with vars:</p><pre style="margin-top: 15px; margin-bottom: 15px; padding: 6px 10px; border: 1px solid #cccccc; font-size: 13px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: #f8f8f8; line-height: 19px; overflow: auto; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; color: #333333; "><code style="margin: 0px; padding: 0px; border: none; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; ">  (render "test.vm" :name "dennis" :age 29) </code></pre><p style="margin: 15px 0px; padding: 0px; border: 0px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">The&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; ">test.vm</code>&nbsp;will be interpreted equals to:</p><pre style="margin-top: 15px; margin-bottom: 15px; padding: 6px 10px; border: 1px solid #cccccc; font-size: 13px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: #f8f8f8; line-height: 19px; overflow: auto; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; color: #333333; "><code style="margin: 0px; padding: 0px; border: none; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; ">  hello,dennis,your age is 29. </code></pre><p style="margin: 15px 0px; padding: 0px; border: 0px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">Use ring.velocity in <a href="https://github.com/weavejester/compojure/">compojure</a>:</p><pre style="margin-top: 15px; margin-bottom: 15px; padding: 6px 10px; border: 1px solid #cccccc; font-size: 13px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: #f8f8f8; line-height: 19px; overflow: auto; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; color: #333333; "><code style="margin: 0px; padding: 0px; border: none; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; ">  (defroutes app-routes      <br />    (GET "/" [] (render "test.vm" :name "dennis" :age 29))   <br />    (route/not-found "Not Found")) </code></pre><p style="margin: 15px 0px; padding: 0px; border: 0px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">Use ring.velocity in <a href="https://github.com/ring-clojure/ring">ring</a>:</p><pre style="margin-top: 15px; margin-bottom: 15px; padding: 6px 10px; border: 1px solid #cccccc; font-size: 13px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: #f8f8f8; line-height: 19px; overflow: auto; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; color: #333333; "><code style="margin: 0px; padding: 0px; border: none; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; ">  (use '[ring.util.response])   <br />  (response (render "test.vm" :name "dennis" :age 29)) </code></pre><p style="margin: 15px 0px; padding: 0px; border: 0px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">Custom velocity properties,just put a file named&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; ">ring-velocity.properties</code>&nbsp;to your classpath or resource paths.The default velocity properties is in&nbsp;<a href="https://github.com/killme2008/ring.velocity/blob/master/src/default/velocity.properties" style="margin: 0px; padding: 0px; border: 0px; color: #4183c4; text-decoration: none; ">src/default/velocity.properties</a>.</p><h2><a name="license" href="https://github.com/killme2008/ring.velocity#license" style="margin: 0px 0px 0px -30px; padding: 0px 0px 0px 30px; border: 0px; color: rgb(65, 131, 196); text-decoration: none; display: block; cursor: pointer; position: absolute; top: 0px; left: 0px; bottom: 0px; "></a>License</h2><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">Copyright &#169; 2012 dennis zhuang[killme2008@gmail.com]</p><p style="margin-top: 15px; margin-right: 0px; margin-bottom: 0px !important; margin-left: 0px; padding: 0px; border: 0px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; ">Distributed under the Eclipse Public License, the same as Clojure.<br /><br />Home:&nbsp;<a href="https://github.com/killme2008/ring.velocity">https://github.com/killme2008/ring.velocity</a></p><img src ="http://www.blogjava.net/killme2008/aggbug/383354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2012-07-18 00:07 <a href="http://www.blogjava.net/killme2008/archive/2012/07/18/383354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分布式消息中间件Metaq发布1.4.3</title><link>http://www.blogjava.net/killme2008/archive/2012/06/04/379895.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 04 Jun 2012 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2012/06/04/379895.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/379895.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2012/06/04/379895.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/379895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/379895.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">我们在维护的淘宝开源消息中间件的<a href="http://metaq.taobao.org/" style="color: #006699; ">metaq</a>的<a href="https://github.com/killme2008/Metamorphosis" style="color: #006699; ">github分支</a>，今天发布了1.4.2版本，主要做了如下改进：<br /><br />1.支持发送和订阅分离，可以细粒度地控制Broker或者某个Topic是否接收消息和接受订阅。服务端添加新选项acceptPublish和acceptSubscribe。<br /><br />2.更友好地关闭Broker，梳理关闭流程并通过JMX调用方法关闭替代原来简单的kill。<br /><br />3.更新<a href="https://github.com/killme2008/Metamorphosis/tree/master/contrib/python/meta-python" style="color: #006699; ">python客户端</a>到0.2版本，可以通过pip安装: &nbsp;pip install metaq<br /><br />4.发布ruby语言客户端<a href="https://github.com/killme2008/Metamorphosis/tree/master/contrib/ruby/meta-ruby" style="color: #006699; ">meta-ruby</a>&nbsp;0.1版本。<br /><br />5.其他小改进：升级gecko到1.1.1版本，升级quartz到2.1.4版本，添加集成测试工程和内部重构等。<br /><br />6.新文档<a href="https://github.com/killme2008/Metamorphosis/wiki/%E4%BD%BF%E7%94%A8Log4j%E6%89%A9%E5%B1%95%E5%8F%91%E9%80%81%E6%B6%88%E6%81%AF">《使用log4j扩展发送消息》</a><br /><br />简介：<a href="https://github.com/killme2008/Metamorphosis/wiki/%E4%BB%8B%E7%BB%8D" style="color: #006699; ">https://github.com/killme2008/Metamorphosis/wiki/介绍</a><br />下载：<a href="https://github.com/killme2008/Metamorphosis/downloads" style="color: #006699; ">https://github.com/killme2008/Metamorphosis/downloads</a></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">文档：<a href="https://github.com/killme2008/Metamorphosis/wiki" style="color: #006699; ">https://github.com/killme2008/Metamorphosis/wiki</a></p><img src ="http://www.blogjava.net/killme2008/aggbug/379895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2012-06-04 10:03 <a href="http://www.blogjava.net/killme2008/archive/2012/06/04/379895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>clj.monitor : monitoring applications in clojure based on SSH</title><link>http://www.blogjava.net/killme2008/archive/2012/05/12/378018.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sat, 12 May 2012 14:38:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2012/05/12/378018.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/378018.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2012/05/12/378018.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/378018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/378018.html</trackback:ping><description><![CDATA[<div><br />&nbsp; &nbsp; My weekend project clj.monitor is beta release,it's a clojure DSL for monitoring system and applications based on SSH.<br />
<br />
Home:<a href="https://github.com/killme2008/clj.monitor">https://github.com/killme2008/clj.monitor
<br /></a><br />
An example:<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->(ns&nbsp;clj.monitor.example<br />
&nbsp;&nbsp;(:use&nbsp;[clj.monitor.core]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[control.core]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[clj.monitor.tasks]))<br />
<br />
;;define&nbsp;a&nbsp;mysql&nbsp;cluster<br />
(defcluster&nbsp;mysql<br />
&nbsp;&nbsp;:clients&nbsp;[{:user&nbsp;"deploy"&nbsp;:host&nbsp;"mysql.app.com"}])<br />
<br />
;;define&nbsp;a&nbsp;monitor&nbsp;for&nbsp;mysql&nbsp;cluster<br />
(defmonitor&nbsp;mysql-monitor<br />
&nbsp;&nbsp;:tasks&nbsp;[(ping-mysql&nbsp;"root"&nbsp;"password")<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (system-load&nbsp;:5&nbsp;3)]<br />
&nbsp;&nbsp;:clusters&nbsp;[:mysql])<br />
<br />
;;start&nbsp;monitors<br />
(start-monitors<br />
&nbsp;:cron&nbsp;"*&nbsp;0/5&nbsp;*&nbsp;*&nbsp;*&nbsp;?"<br />
&nbsp;:alerts&nbsp;[(mail&nbsp;:from&nbsp;"alert@app.com"&nbsp;:to&nbsp;"yourname@app.com")]<br />
&nbsp;:monitors&nbsp;[mysql-monitor])</div>
<br />
API document:<a href="http://fnil.net/clj.monitor">&nbsp;http://fnil.net/clj.monitor
</a>
<br />
<br />It is just a beta release,if you have any questions or find issues ,please let me know,thanks.
</div><img src ="http://www.blogjava.net/killme2008/aggbug/378018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2012-05-12 22:38 <a href="http://www.blogjava.net/killme2008/archive/2012/05/12/378018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分布式消息中间件Metaq发布1.4.2</title><link>http://www.blogjava.net/killme2008/archive/2012/05/09/377748.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Wed, 09 May 2012 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2012/05/09/377748.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/377748.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2012/05/09/377748.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/377748.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/377748.html</trackback:ping><description><![CDATA[<br />
&nbsp; &nbsp; <a href="https://github.com/killme2008/Metamorphosis/wiki/For_Developer">我们</a>在维护的淘宝开源消息中间件的<a href="https://github.com/killme2008/Metamorphosis">metaq</a>的github分支，今天发布了1.4.2版本，主要做了如下改进：<br />
<br />&nbsp; &nbsp; 1.添加了大量的使用和原理文档，参见<a href="https://github.com/killme2008/Metamorphosis/wiki">Wiki</a>。<br />&nbsp; &nbsp; 2.合并tools和server-wrapper工程，提供统一的脚本来管理Broker，管理Broker的工作变得非常容易，全部工作都可以通过metaServer.sh的脚本来执行。同时提供了bat启动脚本，用于在windows上启动Broker做测试。<br />&nbsp; &nbsp; 3.新功能：<br />&nbsp; &nbsp;（1）新的客户端API用来获取topic的分区列表<br />&nbsp; &nbsp;（2）新的客户端API用来获取Broker的统计信息<br />&nbsp; &nbsp;（3）异步复制的Slave可以自动获取Master的配置变更，例如Master在配置文件中新增或者删除了topic并顺利reload热加载成功后，slave可自动复制或者移除变更的topic，无需重启。<br />&nbsp; &nbsp;（4）新的统计项目，可以通过'stats config'协议获取Broker的配置文件。<br />&nbsp; &nbsp; 4.添加meta-python项目，一个python的客户端，暂时仅支持发送消息功能。<br />&nbsp; &nbsp; 5.其他小改进，如统计信息的优化、构建工具的整合等。<br />
<br />&nbsp; &nbsp; 更详细的发行日志请看<a href="https://github.com/killme2008/Metamorphosis/wiki/ReleaseNotes">RelaseNotes</a>。<br />
<br />&nbsp; &nbsp; 下载地址： &nbsp;<a href="https://github.com/killme2008/Metamorphosis/downloads">https://github.com/killme2008/Metamorphosis/downloads<br /></a>&nbsp; &nbsp; 入门指南： &nbsp;《<a href="https://github.com/killme2008/Metamorphosis/wiki/%E5%A6%82%E4%BD%95%E5%BC%80%E5%A7%8B">如何开始</a>》<br />&nbsp; &nbsp; 更多文档请看<a href="https://github.com/killme2008/Metamorphosis/wiki">Wiki</a>。<img src ="http://www.blogjava.net/killme2008/aggbug/377748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2012-05-09 22:47 <a href="http://www.blogjava.net/killme2008/archive/2012/05/09/377748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>淘宝开源MQ——metaq的详细文档</title><link>http://www.blogjava.net/killme2008/archive/2012/04/13/374110.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Fri, 13 Apr 2012 14:43:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2012/04/13/374110.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/374110.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2012/04/13/374110.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/374110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/374110.html</trackback:ping><description><![CDATA[<br />
<span style="font-size: 10pt; ">&nbsp; &nbsp; 最近陆陆续续补充了不少</span><a href="https://github.com/killme2008/Metamorphosis"><span style="font-size: 10pt; ">metaq</span></a><span style="font-size: 10pt; ">的文档，部分是直接从官方文档里摘抄出来，放在了</span><a href="https://github.com/killme2008/Metamorphosis/wiki"><span style="font-size: 10pt; ">github工程的wiki页</span></a><span style="font-size: 10pt; ">，有兴趣了解甚至使用meta的可以仔细阅读下，一份目录：</span>
<div id="wiki-content" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; background-color: #ffffff; ">
<div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; ">
<div id="wiki-body"  instapaper_body"="" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; ">
<div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; ">
<ul style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 30px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; ">
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/%E4%BB%8B%E7%BB%8D" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">介绍</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/%E6%A6%82%E5%BF%B5%E5%92%8C%E6%9C%AF%E8%AF%AD" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">基础概念和术语定义</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/%E6%B6%88%E6%81%AF%E7%9A%84%E5%8F%AF%E9%9D%A0%E6%80%A7%E3%80%81%E9%A1%BA%E5%BA%8F%E5%92%8C%E9%87%8D%E5%A4%8D" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">消息的可靠性、顺序和重复</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/%E5%A6%82%E4%BD%95%E5%BC%80%E5%A7%8B" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">如何开始</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/%E7%AE%80%E5%8D%95%E4%BE%8B%E5%AD%90" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">简单例子</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">服务端配置管理</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/%E9%9B%86%E7%BE%A4%E5%92%8C%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">集群和负载均衡</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/HA" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">高可用配置(异步复制和同步复制)</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/roadmap" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">路线图</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/Faq-chinese" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">FAQ</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">最佳实践</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="http://code.taobao.org/p/metamorphosis/file/2154/%E8%AF%A6%E7%BB%86%E6%89%8B%E5%86%8C.docx" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">官方手册(word文档)</span></a></li>
</ul>
<h1 style="line-height: 1.6; "><span style="font-size: 10pt; ">&nbsp; &nbsp; Developer</span></h1>
<ul style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 30px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; ">
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/For_Developer" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">参与贡献</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/design" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">设计</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/%E5%8D%8F%E8%AE%AE" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">通讯协议</span></a></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/Metamorphosis/wiki/%E6%B6%88%E6%81%AF%E7%9A%84%E5%AD%98%E5%82%A8" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">消息的存储</span></a></li>
</ul>
<h1 style="line-height: 1.6; "><span style="font-size: 10pt; ">关联项目</span></h1>
<ul style="margin-top: 15px; margin-right: 0px; margin-bottom: 0px !important; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 30px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; ">
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/metamorphosis-example" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">metamorphosis-example</span></a><span style="font-size: 10pt; ">:示例项目</span></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/storm-metamorphosis-spout" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">storm-metamorphosis-spout</span></a><span style="font-size: 10pt; ">:使用metamorphosis作为twitter storm的spout源</span></li>
     <li style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; "><a href="https://github.com/killme2008/meta-python" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-size: 14px; font: inherit; color: #4183c4; text-decoration: none; "><span style="font-size: 10pt; ">meta-python</span></a><span style="font-size: 10pt; ">: metamorphosis的python语言客户端。目前只支持发送消息功能。</span></li>
</ul>
</div>
</div>
</div>
</div>
<div id="gollum-footer" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; line-height: 19px; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; background-color: #ffffff; "></div>
&nbsp; &nbsp;&nbsp;<br />
<div><span style="font-size: 10pt; ">&nbsp; &nbsp; 后续还会继续补充。</span><br />
</div><img src ="http://www.blogjava.net/killme2008/aggbug/374110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2012-04-13 22:43 <a href="http://www.blogjava.net/killme2008/archive/2012/04/13/374110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>淘宝开源metaq的python客户端</title><link>http://www.blogjava.net/killme2008/archive/2012/03/21/372405.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Wed, 21 Mar 2012 11:08:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2012/03/21/372405.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/372405.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2012/03/21/372405.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/372405.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/372405.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; 前面一篇博客介绍了我在github上的一个<a href="https://github.com/killme2008/Metamorphosis">metaq</a>分支，今天下午写了个metaq的python客户端，目前仅支持发送消息功能，不过麻雀虽小，五脏俱全，客户端和zookeeper的交互和连接管理之类都还具备，不出意外，我们会首先用上。第一次正儿八经地写python代码，写的不好的地方请尽管拍砖，多谢。<br />&nbsp; &nbsp; 项目叫meta-python，仍然放在github上：<a href="https://github.com/killme2008/meta-python">https://github.com/killme2008/meta-python<br /><br /></a>&nbsp; &nbsp; 使用需要先安装zkpython这个库，具体安装<a href="http://www.zlovezl.cn/articles/40/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font: inherit; color: #4183c4; text-decoration: none; font-family: Helvetica, arial, freesans, clean, sans-serif; line-height: 22px; background-color: #ffffff; ">这篇博客</a>，使用很简单，发送消息：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;metamorphosis&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;Message,MessageProducer,SendResult<br />&nbsp;&nbsp;&nbsp;&nbsp;p=MessageProducer(<span style="color: #800000; ">"</span><span style="color: #800000; ">topic</span><span style="color: #800000; ">"</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;message=Message(<span style="color: #800000; ">"</span><span style="color: #800000; ">topic</span><span style="color: #800000; ">"</span>,<span style="color: #800000; ">"</span><span style="color: #800000; ">message&nbsp;body</span><span style="color: #800000; ">"</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;p.send(message)<br />&nbsp;&nbsp;&nbsp;&nbsp;p.close()</div><br />&nbsp; &nbsp;&nbsp;<div style="display: inline-block; ">MessageProducer就是消息发送者，它的构造函数接受至少一个topic，默认的zk_servers为localhost:2181，可以通过zk_servers参数指定你的zookeeper集群:<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->p=MessageProducer(<span style="color: #800000; ">"</span><span style="color: #800000; ">topic</span><span style="color: #800000; ">"</span>,zk_servers=<span style="color: #800000; ">"</span><span style="color: #800000; ">192.168.1.100:2191,192.168.1.101:2181</span><span style="color: #800000; ">"</span>)</div><span style="background-color: #eeeeee; "><br /></span><span style="background-color: #eeeeee; ">更多参数请直接看源码吧。一个本机的性能测试（meta和客户端都跑在我的机器上，机器是Mac MC700，osx 10.7，磁盘没有升级过）：<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">from</span>&nbsp;metamorphosis&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;Message,MessageProducer<br /><span style="color: #0000FF; ">from</span>&nbsp;time&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;time<br />p=MessageProducer(<span style="color: #800000; ">"</span><span style="color: #800000; ">avos-fetch-tasks</span><span style="color: #800000; ">"</span>)<br />message=Message(<span style="color: #800000; ">"</span><span style="color: #800000; ">avos-fetch-tasks</span><span style="color: #800000; ">"</span>,<span style="color: #800000; ">"</span><span style="color: #800000; ">http://www.taobao.com</span><span style="color: #800000; ">"</span>)<br />start=time()<br /><span style="color: #0000FF; ">for</span>&nbsp;i&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;range(0,10000):<br />&nbsp;&nbsp;&nbsp;&nbsp;sent=p.send(message)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;<span style="color: #0000FF; ">not</span>&nbsp;sent.success:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">send&nbsp;failed</span><span style="color: #800000; ">"</span><br />finish=time()<br />secs=finish-start<br /><span style="color: #0000FF; ">print</span>&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">duration:%s&nbsp;seconds</span><span style="color: #800000; ">"</span>&nbsp;%&nbsp;(secs)<br /><span style="color: #0000FF; ">print</span>&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">tps:%s&nbsp;msgs/second</span><span style="color: #800000; ">"</span>&nbsp;%&nbsp;(10000/secs)<br />p.close()</div><span style="background-color: #eeeeee; "><br />&nbsp;结果：<br /><br /><br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->duration:1.85962295532&nbsp;seconds<br />tps:5377.43415749&nbsp;msgs/second</div></div><img src ="http://www.blogjava.net/killme2008/aggbug/372405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2012-03-21 19:08 <a href="http://www.blogjava.net/killme2008/archive/2012/03/21/372405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xmemcached发布1.3.6</title><link>http://www.blogjava.net/killme2008/archive/2012/03/19/372179.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 19 Mar 2012 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2012/03/19/372179.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/372179.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2012/03/19/372179.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/372179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/372179.html</trackback:ping><description><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">&nbsp; &nbsp; 开源的memcached Java客户端&#8212;&#8212;<a href="http://code.google.com/p/xmemcached/" target="_blank" style="color: #006699; ">xmemcached</a>发布1.3.6版本。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; "><strong style="font-weight: bold; ">&nbsp; &nbsp; 主要改进如下：</strong>&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">1. &nbsp;为MemcachedClientBuilder添加两个新方法用于配置：<br />
</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setConnectTimeout(<span style="color: #0000FF; ">long</span>&nbsp;connectTimeout);&nbsp;&nbsp;<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setSanitizeKeys(<span style="color: #0000FF; ">boolean</span>&nbsp;sanitizeKeys);</div>
<p>&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">2. &nbsp;用于hibernate的XmemcachedClientFactoryd添加了connectTimeout属性，感谢网友<strong style="font-weight: bold; font-size: 13px; ">&nbsp;</strong><span style="font-size: 13px; ">Boli.Jiang的贡献。</span></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">3. &nbsp;添加新的枚举类型&nbsp;net.rubyeye.xmemcached.transcoders.CompressionMode，用于指定Transcoder的压缩类型，默认是ZIP压缩，可选择GZIP压缩。Transcoder接口添加setCompressionMode方法。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">4. &nbsp;修改心跳规则，原来是在连接空闲的时候发起心跳，现在变成固定每隔5秒发起一次心跳检测连接。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">5. &nbsp;修改默认参数，默认禁用nagle算法，默认将批量get的合并因子下降到50。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">6. &nbsp;修复bug和改进，包括：<a href="http://code.google.com/p/xmemcached/issues/detail?id=161" target="_blank" style="color: #006699; ">161</a>、<a href="http://code.google.com/p/xmemcached/issues/detail?id=163" target="_blank" style="color: #006699; ">163</a>、<a href="http://code.google.com/p/xmemcached/issues/detail?id=165" target="_blank" style="color: #006699; ">165</a>、<a href="http://code.google.com/p/xmemcached/issues/detail?id=169" target="_blank" style="color: #006699; ">169</a>、<a href="http://code.google.com/p/xmemcached/issues/detail?id=172" target="_blank" style="color: #006699; ">172</a><a href="http://code.google.com/p/xmemcached/issues/detail?id=173" target="_blank" style="color: #006699; ">、173</a>、<a href="http://code.google.com/p/xmemcached/issues/detail?id=176" target="_blank" style="color: #006699; ">176</a>、<a href="http://code.google.com/p/xmemcached/issues/detail?id=179" target="_blank" style="color: #006699; ">179</a>和<a href="http://code.google.com/p/xmemcached/issues/detail?id=180" target="_blank" style="color: #006699; ">180</a>。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">项目主页：<a href="http://code.google.com/p/xmemcached/" target="_blank" style="color: #006699; ">http://code.google.com/p/xmemcached/</a></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">项目文档：<a href="http://code.google.com/p/xmemcached/w/list" target="_blank" style="color: #006699; ">http://code.google.com/p/xmemcached/w/list</a></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">下载：<a href="http://code.google.com/p/xmemcached/downloads/list" target="_blank" style="color: #006699; ">http://code.google.com/p/xmemcached/downloads/list</a></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">源码：<a href="https://github.com/killme2008/xmemcached" target="_blank" style="color: #006699; ">https://github.com/killme2008/xmemcached</a></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; "><strong style="font-weight: bold; ">Maven依赖：</strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #f7f7f7; ">&nbsp;<span style="background-color: #eeeeee; font-size: 13px; ">&lt;</span><span style="background-color: #eeeeee; font-size: 13px; ">dependency</span><span style="background-color: #eeeeee; font-size: 13px; ">&gt;</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;&nbsp;</span></p>
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;com.googlecode.xmemcached&lt;/groupId&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;xmemcached&lt;/artifactId&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;version&gt;1.3.6&lt;/version&gt;&nbsp;&nbsp;<br />
&lt;/dependency&gt;&nbsp;</div>
<br />&nbsp; &nbsp; 最后感谢所有提出issue和改进意见的朋友们。<img src ="http://www.blogjava.net/killme2008/aggbug/372179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2012-03-19 10:51 <a href="http://www.blogjava.net/killme2008/archive/2012/03/19/372179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Clojure-Control 0.3.0 is out</title><link>http://www.blogjava.net/killme2008/archive/2012/02/18/370260.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sat, 18 Feb 2012 14:08:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2012/02/18/370260.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/370260.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2012/02/18/370260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/370260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/370260.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; <font><a href="https://github.com/killme2008/clojure-control" target="_blank">Clojure-control</a> is a clojure DSL for system admin and deployment with many remote machines via ssh.&nbsp; <br /></font><font>&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; I am pleased to annoucment that clojure-control 0.3.0 is out.It adds some&nbsp; powerful features in this release ,includes:<br />
</font><ul><li><font>ssh and scp both have a new option :sudo&nbsp; to be executed as root on remote machines,for example:<br /></font><pre style="font-family:arial,helvetica,sans-serif"><font><code>(ssh "/etc/init.d/ssh restart" :sudo true)</code></font></pre>
</li><li><font>scp has a new&nbsp; option :mode to change file modes copied from local:&nbsp; <br /></font><pre style="font-family:arial,helvetica,sans-serif"><font><code>(scp "start.sh" "/etc/init.d/start.sh" :sudo true :mode 755)</code></font></pre>
</li><li><font>A&nbsp; new function "exists?" to test if a file exists on remote machines:&nbsp;&nbsp; <br /></font><pre style="font-family:arial,helvetica,sans-serif"><font><code>(if (not (exists? (str "/home/deploy/.ssh")))
      (ssh (sudo (str "mkdir -p /home/deploy/.ssh"))))</code></font></pre></li><li><font>Call other task in deftask with "call" function:</font><pre style="font-family:arial,helvetica,sans-serif"><font><code>(deftask :ps "A task to grep process" [process]
        (ssh (str "ps aux | grep " process)))
(deftask :start_ha []
        (ssh "/etc/init.d/haproxy start")
        (call :ps "haproxy"))</code></font></pre></li><li><font>A new function "append" to append a line to a file on remote machines:<br /></font><pre style="font-family:arial,helvetica,sans-serif"><font><code>(ssh (append "/etc/hosts" "192.168.1.100 web" :sudo true))</code></font></pre>
</li><li><font>A new function "sed" to replace lines in a file on remote machines,and comm/uncomm to comment/uncomment a line in a file:<br /></font><pre><font><code>      <span style="font-family:arial,helvetica,sans-serif">(sed &lt;file&gt; &lt;before&gt; &lt;after&gt; :flags &lt;flags&gt; :limit &lt;limit&gt; :backup &lt;backup&gt;)</span>
</code></font></pre>

<p><font>Equivalent to</font></p>

<pre style="font-family:arial,helvetica,sans-serif"><font><code>      sed -i&lt;backup&gt; -r -e "&lt;limit&gt; s/&lt;before&gt;/&lt;after&gt;/&lt;flags&gt;g &lt;filename&gt;"</code></font></pre></li><li><pre><font>Limits max output line to 10000.</font></pre>
</li><li><pre><font>Adds more documents in wiki: <span></span><a href="http://goog_909345399/" target="_blank">https://github.com/killme2008/<wbr>clojure-control/wiki</a><code><a> </a></code></font></pre></li></ul><font>&nbsp;&nbsp; You can install the new version by :<br />
</font>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp; lein&nbsp;plugin&nbsp;install&nbsp;control&nbsp;</span><span style="color: #000000; ">0.3</span><span style="color: #000000; ">.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">For&nbsp;clojure&nbsp;1.3</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp; lein&nbsp;plugin&nbsp;install&nbsp;control&nbsp;</span><span style="color: #000000; ">0.3</span><span style="color: #000000; ">.</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">For&nbsp;clojure&nbsp;1.2</span></div><font><code><br />&nbsp;&nbsp;&nbsp; More information please visit it on github: <a href="https://github.com/killme2008/clojure-control" target="_blank">https://github.com/killme2008/<wbr>clojure-control</a> </code><code></code></font><img src ="http://www.blogjava.net/killme2008/aggbug/370260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2012-02-18 22:08 <a href="http://www.blogjava.net/killme2008/archive/2012/02/18/370260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Clojure世界： STM的统计</title><link>http://www.blogjava.net/killme2008/archive/2012/02/09/369694.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 09 Feb 2012 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2012/02/09/369694.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/369694.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2012/02/09/369694.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/369694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/369694.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 年前一篇blog提过，写了一个stm-profiler用于统计clojure STM的运行状况，放在了github上：<br />
<a href="https://github.com/killme2008/stm-profiler">https://github.com/killme2008/stm-profiler</a><br />
<br />
&nbsp;&nbsp; STM的事务在遇到写冲突（多个事务写同一个ref的时候）就会回滚事务并重试，通过stm-profiler你可以查看事务的重试次数，重试原因，以及每个reference的使用情况。使用很简单，在lein的project.clj引用stm-profiler:<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">[stm-profiler&nbsp;"1.0.2-SNAPSHOT"]</span></div>
<br />
注意，目前stm profiler仅支持clojure 1.3。<br />
<br />
我们写一个简单例子：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(use&nbsp;'stm)<br />
(def&nbsp;a&nbsp;(ref&nbsp;1))<br />
(def&nbsp;b&nbsp;(ref&nbsp;2))<br />
<br />
(dotimes&nbsp;[_&nbsp;100]&nbsp;(future&nbsp;(dosync&nbsp;(alter&nbsp;a&nbsp;+&nbsp;1)&nbsp;(alter&nbsp;b&nbsp;-&nbsp;1))))<br />
(Thread/sleep&nbsp;1000)<br />
(prn&nbsp;@a)<br />
(prn&nbsp;@b)<br />
(Thread/sleep&nbsp;1000)<br />
(prn&nbsp;"stm&nbsp;statistics"&nbsp;(stm-stats))<br />
(prn&nbsp;"reference&nbsp;a&nbsp;statistics"&nbsp;(ref-stats&nbsp;a))<br />
(prn&nbsp;"reference&nbsp;b&nbsp;statistics"&nbsp;(ref-stats&nbsp;b))<br />
</span></div>
<br />
定义了两个ref：a和b，然后用future启动100个线程并发地发起同一个事务操作，对a加一，对b减一。最后打印a和b的值，使用stm-stats函数获取stm的统计信息并打印，使用ref-stats获取a和b两个reference的统计信息并打印。<br />
<br />
运行这个例子，在启动的时候会有些警告信息，忽略即可（主要是因为stm profiler重新定义了一些跟STM相关的函数和宏，如dosync等，但是仅仅是添加了统计功能，并没有修改他们原本的功能）。<br />
<br />
在我机器上的一次输出：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">101<br />
-98<br />
"stm&nbsp;statistics"&nbsp;{"(alter&nbsp;a&nbsp;+&nbsp;1)(alter&nbsp;b&nbsp;-&nbsp;1)"&nbsp;{:not-running&nbsp;11,&nbsp;:average-retry&nbsp;5,&nbsp;:total-cost&nbsp;1233,&nbsp;:get-fault&nbsp;44,&nbsp;:barge-fail&nbsp;224,&nbsp;:change-committed&nbsp;227,&nbsp;:total-times&nbsp;100,&nbsp;:average-cost&nbsp;12}}<br />
"reference&nbsp;a&nbsp;statistics"&nbsp;{"(alter&nbsp;a&nbsp;+&nbsp;1)(alter&nbsp;b&nbsp;-&nbsp;1)"&nbsp;{:alter&nbsp;609,&nbsp;:get-fault&nbsp;44,&nbsp;:barge-fail&nbsp;224,&nbsp;:change-committed&nbsp;227}}<br />
"reference&nbsp;b&nbsp;statistics"&nbsp;{"(alter&nbsp;a&nbsp;+&nbsp;1)(alter&nbsp;b&nbsp;-&nbsp;1)"&nbsp;{:alter&nbsp;114,&nbsp;:not-running&nbsp;11}}</span></div>
<br />
a和b的结果都没问题。重点看打印的统计信息，(stm-stats)的输出结果是：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">{"(alter&nbsp;a&nbsp;+&nbsp;1)(alter&nbsp;b&nbsp;-&nbsp;1)"&nbsp;{:not-running&nbsp;11,&nbsp;:average-retry&nbsp;5,&nbsp;:total-cost&nbsp;1233,&nbsp;:get-fault&nbsp;44,&nbsp;:barge-fail&nbsp;224,&nbsp;:change-committed&nbsp;227,&nbsp;:total-times&nbsp;100,&nbsp;:average-cost&nbsp;12}}</span></div>
<br />
这个结果是一个map,key是事务的form，而value就是该form的统计信息，也是一个map，具体各项的含义如下：<br />
<table bgcolor="#C0C0C0" border="3" bordercolor="#000000" cellpadding="2" cellspacing="2" height="102" width="722">
     <tbody>
         <tr>
             <td> total-cost<br />
             </td>
             <td> 所有事务的总耗时<br />
             </td>
             <td> 100个事务耗时1233毫秒<br />
             </td>
         </tr>
         <tr>
             <td> total-times<br />
             </td>
             <td> 事务运行次数<br />
             </td>
             <td> 100次<br />
             </td>
         </tr>
         <tr>
             <td> average-cost<br />
             </td>
             <td> 平均每个事务耗时<br />
             </td>
             <td> 平均一个事务耗时12毫秒<br />
             </td>
         </tr>
         <tr>
             <td>average-retry<br />
             </td>
             <td>平均每个事务的重试次数</td>
             <td>&nbsp;平均每个事务重试了5次才成功</td>
         </tr>
         <tr>
             <td>not-running</td>
             <td>&nbsp;当前事务不处于running状态，可能是被其他事务打断（barge)，需要重试</td>
             <td>&nbsp;因为not-running的原因重试了11次</td>
         </tr>
         <tr>
             <td>get-fault<br />
             </td>
             <td>&nbsp;读取ref值的时候没有找到read point之前的值，被认为是一次读错误，需要重试<br />
             </td>
             <td>&nbsp;因为读ref错误重试了44次<br />
             </td>
         </tr>
         <tr>
             <td>barge-fail</td>
             <td>&nbsp;打断其他事务失败次数，需要重试</td>
             <td>&nbsp;尝试打断其他事务失败而重试了224次</td>
         </tr>
         <tr>
             <td>change-committed</td>
             <td>&nbsp;在本事务read point之后有ref值获得提交，则需要重试<br />
             </td>
             <td>&nbsp;因为ref值被其他事务提交而重试了227次</td>
         </tr>
     </tbody>
</table>
<br />
&nbsp;&nbsp;&nbsp; 从输出结果来看，这么简单的一个事务操作，每次事务要成功平均都需要经过5次的重试，最大的原因是因为ref的值在事务中被其他事务更改了，或者尝试打断其他正在运行的事务失败而重试。关于clojure STM的具体原理推荐看这篇文章《<a href="http://java.ociweb.com/mark/stm/article.html#barge">Software transactional memory</a>》。STM不是完美的，事务重试和保存每个reference的历史版本的代价都不低。<br /><br />&nbsp;&nbsp;&nbsp; 再看<span style="color: #000000;">(ref-stats&nbsp;a)的输出：<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{"(alter&nbsp;a&nbsp;+&nbsp;1)(alter&nbsp;b&nbsp;-&nbsp;1)"&nbsp;{:alter&nbsp;609,&nbsp;:get-fault&nbsp;44,&nbsp;:barge-fail&nbsp;224,&nbsp;:change-committed&nbsp;227}}</span></div>&nbsp;&nbsp;&nbsp; 可以看到a在所有事务中的统计信息，返回的结果同样是个map，key是使用了a的事务，value是具体的统计信息。各项的含义类似上表，不过这里精确到了具体的reference。其中alter项是指对a调用alter函数了609次。ref-stats会输出所有在事务中调用了a的函数的调用次数。<br /><br />&nbsp;&nbsp;&nbsp; 通过stm profiler你可以分析具体每个事务的执行状况，甚至每个reference的运行状况，查找热点事务和热点reference等。stm-profiler还不完善，目前还不支持1.2（1.4测试是可以的）。希望有兴趣的朋友加入进来一起完善。<br /><br />转载请注明出处：<a id="Editor_Edit_hlEntryLink" title="view: Clojure世界： STM的统计" href="../archive/2012/02/09/369694.html" target="_blank">http://www.blogjava.net/killme2008/archive/2012/02/09/369694.html</a><img src ="http://www.blogjava.net/killme2008/aggbug/369694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2012-02-09 20:55 <a href="http://www.blogjava.net/killme2008/archive/2012/02/09/369694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>storm集群的监控</title><link>http://www.blogjava.net/killme2008/archive/2011/12/01/365329.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 01 Dec 2011 13:02:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/12/01/365329.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/365329.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/12/01/365329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/365329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/365329.html</trackback:ping><description><![CDATA[<br />&nbsp;&nbsp;&nbsp; 所谓兵马未动，粮草先行，准备将<a href="https://github.com/nathanmarz/storm/wiki">storm</a>用在某个项目中做实时数据分析。无论任何系统，一定要有监控系统并存，当故障发生的时候你能第一个知道，而不是让别人告诉你，那处理故障就很被动了。<br /><br />&nbsp;&nbsp;&nbsp; 因此我写了这么个项目，取名叫storm-monitor，放在了github上<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://github.com/killme2008/storm-monitor">https://github.com/killme2008/storm-monitor</a><br /><br />&nbsp;&nbsp;&nbsp; 主要功能如下：<br />1.监控supervisor数目是否正确，当supervisor挂掉的时候会发送警告。<br />2.监控nimbus是否正常运行，monitor会尝试连接nimbus，如果连接失败就认为nimbus挂掉。<br />3.监控topology是否正常运行，包括它是否正常部署，是否有运行中的任务。<br /><br />&nbsp;&nbsp;&nbsp; 当故障发生的时候通过alarm方法警告用户，开放出去的只是简单地打日志。因为每个公司的告警接口不一样，所以你需要自己扩展，修改alarm.clj即可。我们这儿就支持旺旺告警和手机短信告警。<br /><br />&nbsp;&nbsp;&nbsp; 基本的原理很简单，对supervisor和topology的监控是通过zookeeper来间接地监控，通过定期查看path是否存在。对nimbus的监控是每次起一个短连接连上去，连不上去即认为挂掉。<br /><br />&nbsp;&nbsp;&nbsp; 整个项目也是用clojure写。你的机器需要安装<a href="https://github.com/technomancy/leiningen">lein</a>和<a href="https://github.com/kumarshantanu/lein-exec">exec</a>插件，然后将你的storm.yaml拷贝到conf目录下，编辑monitor.yaml设定监控参数如检查间隔等，最后启动start.sh脚本即可。默认日志输出在logs/monitor.log。<br /><img src ="http://www.blogjava.net/killme2008/aggbug/365329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-12-01 21:02 <a href="http://www.blogjava.net/killme2008/archive/2011/12/01/365329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>clj-xmemcached:  memcached client for clojure</title><link>http://www.blogjava.net/killme2008/archive/2011/10/30/362315.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sun, 30 Oct 2011 05:03:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/10/30/362315.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/362315.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/10/30/362315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/362315.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/362315.html</trackback:ping><description><![CDATA[<div class="wikistyle"><h1><a href="https://github.com/killme2008/clj-xmemcached">clj-xmemcached</a></h1>

<p>&nbsp;&nbsp;&nbsp; <a href="https://github.com/killme2008/clj-xmemcached">Clj-xmemcached</a> is an opensource memcached client for clojure wrapping <a href="http://code.google.com/p/xmemcached/">xmemcached</a>. <a href="http://code.google.com/p/xmemcached/">Xmemcached</a> is an opensource high performance memcached client for java.</p>

<h2>Leiningen Usage</h2>

<p>To include clj-xmemcached,add:</p>

<pre><code>     [clj-xmemcached "0.1.1"]
</code></pre>

<p>to your project.clj.</p>

<h2>Usage</h2>

<h3>Create a client<code></code></h3><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">(use&nbsp;[clj</span><span style="color: #000000; ">-</span><span style="color: #000000; ">xmemcached.core])<br />(def&nbsp;client&nbsp;(xmemcached&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">host:port</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br />(def&nbsp;client&nbsp;(xmemcached&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">host1:port1&nbsp;host2:port2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;:protocol&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">binary</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))</span></div>



<p>Then we create a memcached client using binary protocol to talk with memcached servers host1:port1 and host2:port2.
Valid options including:</p>

<pre><code>  :name       Client's name
  :protocol  Protocol to talk with memcached,a string value in text,binary or kestrel,default is text protocol.
  :hash          Hash algorithm,a string value in consistent or standard,default is standard hash.
  :timeout    Operation timeout in milliseconds,default is five seconds.
  :pool          Connection pool size,default is one.
</code></pre>

<h3>Store items<code></code></h3><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">(xset&nbsp;client&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">key</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">dennis</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />(xset&nbsp;client&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">key</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">dennis</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">)<br />(xappend&nbsp;client&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">key</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;zhuang</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />(xprepend&nbsp;client&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">key</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hello,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)</span></div><br />



<p>The value 100 is the expire time for the item in seconds.Store 
functions include xset,xadd,xreplace,xappend and xprepend.Please use doc
 to print documentation for these functions.</p>

<h3>Get items</h3>

<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">(xget&nbsp;client&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">key</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />(xget&nbsp;client&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">key1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">key2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">key3</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />(xgets&nbsp;client&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">key</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)</span><code>
</code></div>

<p>xgets returns a value including a cas value,for example:</p>

<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;{:value&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hello,dennis&nbsp;zhuang</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;:</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;net.rubyeye.xmemcached.GetsResponse,&nbsp;:cas&nbsp;</span><span style="color: #000000; ">396</span><span style="color: #000000; ">}</span><code>
</code></div>

<p>And bulk get returns a HashMap contains existent items.</p>

<h3>Increase/Decrease numbers<code></code></h3><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">(xincr&nbsp;client&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">num</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />(xdecr&nbsp;client&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">num</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />(xincr&nbsp;client&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">num</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)</span></div><br />



<p>Above codes try to increase/decrease a number in memcached with key "num",and if the item is not exists,then set it to zero.</p>

<h3>Delete items</h3>

<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">(xdelete&nbsp;client&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">num</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)</span><code>
</code></div>

<h3>Compare and set</h3>

<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">(xcas&nbsp;client&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">key</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;inc)</span><code>
</code></div>

<p>We use inc function to increase the current value in memcached and try to compare and set it at most Integer.MAX_VALUE times.
xcas can be called as:<code><br /></code></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;(xcas&nbsp;client&nbsp;key&nbsp;cas</span><span style="color: #000000; ">-</span><span style="color: #000000; ">fn&nbsp;max</span><span style="color: #000000; ">-</span><span style="color: #000000; ">times)</span></div><p><code>
</code></p>



<p>The cas-fn is a function to return a new value,set the new value to </p>

<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">(cas</span><span style="color: #000000; ">-</span><span style="color: #000000; ">fn&nbsp;current</span><span style="color: #000000; ">-</span><span style="color: #000000; ">value)</span><code>
</code></div>

<h3>Shutdown</h3>

<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">(xshutdown&nbsp;client)</span><code>
</code></div>

<h3>Flush</h3>

<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">(xflush&nbsp;client)<br />(xflush&nbsp;client&nbsp;(InetSocketAddress.&nbsp;host&nbsp;port))</span><code>
</code></div>

<h3>Statistics</h3>

<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">(xstats&nbsp;client)</span><code>
</code></div>

<h3>Example</h3>

<p>Please see the example code in <a href="https://github.com/killme2008/clj-xmemcached/blob/master/example/demo.clj">example/demo.clj</a></p>

<h2>License</h2>

<p>Copyright (C) 2011-2014 dennis zhuang[<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#107;&#105;&#108;&#108;&#109;&#101;&#50;&#48;&#48;&#56;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">killme2008@gmail.com</a>]</p>

<p>Distributed under the Eclipse Public License, the same as Clojure.</p></div><img src ="http://www.blogjava.net/killme2008/aggbug/362315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-10-30 13:03 <a href="http://www.blogjava.net/killme2008/archive/2011/10/30/362315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我写的这些opensource项目</title><link>http://www.blogjava.net/killme2008/archive/2011/10/09/360311.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sun, 09 Oct 2011 12:23:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/10/09/360311.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/360311.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/10/09/360311.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/360311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/360311.html</trackback:ping><description><![CDATA[<br />&nbsp;&nbsp;&nbsp; 将自己在googlecode和github上的所有项目过了一遍，整理一张列表，列下一些还有点价值和用处的项目，都不是什么great job，纯粹是为了工作需要或者乐趣写的东西，看官要是有兴趣也可以瞧瞧。<br /><br />&nbsp;一 Java相关<br /><br />1.<a href="http://code.google.com/p/xmemcached/">Xmemcached</a>，还算是比较多人使用的一个java memcached client，优点是效率和易用性，缺点是代码写的不怎么样，两年前发展到现在的东西，以后还会继续维护。<br /><br />2.<a href="http://code.google.com/p/hs4j/">HS4J</a>，看<a href="https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL">handlersocket</a>的时候顺手写的客户端，我们公司内部某些项目在用，可能还有其他公司外的朋友在用，后来同事聚石贡献了一个扩展项目<a href="https://github.com/killme2008/hs4j/tree/master/contributes">hs4j-kit</a>，更易于使用，他写的代码很优雅漂亮，推荐一看。暂时没有精力维护。<br /><br />3.<a href="http://code.google.com/p/aviator/">Aviator</a>，一个很初级的表达式执行引擎，行家看到肯定要笑话我。不过语法上很符合我自己的口味，我们自己的项目在用，也有几个朋友在用，会继续维护。<br /><br />4.<a href="https://github.com/killme2008/jevent">Jevent</a>，一个玩具，其实是模仿libevent的一个java实现，对nio或者libevent的实现机制感兴趣的还可以看看。<br /><br />5. <a href="https://github.com/killme2008/kilim">Kilim</a>，我fork的kilim实现，修改了nio调度器，使用多个reactor做调度效率更高，并添加了一个HttpClient的实现。<br /><br />二 Android项目<br /><br />学习android完全是玩票性质，有3个项目，对初学android开发的可能有点参考价值。<br /><br />1.<a href="https://github.com/killme2008/whetherweather">WhetherWeather</a>，一个天气预报和告警的widget插件，UI太丑了。<br />2.<a href="https://github.com/killme2008/UniqRecorder">UniqRecorder</a>，写来记录儿子体重变化的小工具，可以自定义项目和生成曲线图，我自己还在用。<br />3.<a href="https://github.com/killme2008/UniqTask">UniqTask</a>，最近写的杀进程工具，绝对轻量级，没广告，也是我自己在用。<br /><br />三 Clojure项目<br /><br />1.<a href="https://github.com/killme2008/cscheme">cscheme</a>，一个用clojure实现的scheme解释器，基于sicp这本书的解释器实现。<br />2.<a href="https://github.com/killme2008/clojure-control">clojure-control</a>，类似<a href="https://github.com/tsmith/node-control">node-control</a>的分布式部署和管理的DSL实现，挺好玩的，也有朋友在用，我自己还用不上,sunny有写了个很方便的lein插件<a href="https://github.com/sunng87/lein-control">node-control</a>。<br /><br />clojure还写了一堆烂尾项目，就不拿出来恶心人了。<br /><br />四 其他<br /><br />1.<a href="https://github.com/killme2008/node-zk-browser">node-zk-browser</a>，一个展现和管理zookeeper的web应用，我们自己在用，基于node.js实现。<br />2.<a href="https://github.com/killme2008/erlwsh">erlwsh</a>，一个erlang的web shell实现，可以在浏览器里做erlang编程，被一些开源项目比如membase用到了。<br /><br />&nbsp;&nbsp;&nbsp; 写这些东西对我自己最有好处，如果能顺便给他人带来好处，那是额外的好处。最近正处于我自己一生中也许是最大的转折关头，不能更新blog了，最后，祈求诸天神佛能带来奇迹。<img src ="http://www.blogjava.net/killme2008/aggbug/360311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-10-09 20:23 <a href="http://www.blogjava.net/killme2008/archive/2011/10/09/360311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>紧急发布xmemcached 1.3.5</title><link>http://www.blogjava.net/killme2008/archive/2011/10/01/359898.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sat, 01 Oct 2011 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/10/01/359898.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/359898.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/10/01/359898.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/359898.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/359898.html</trackback:ping><description><![CDATA[<br />&nbsp;&nbsp;&nbsp; xmemcached紧急发布1.3.5版本，主要是修复两个相对严重的bug:<br /><br /><a href="http://code.google.com/p/xmemcached/issues/detail?id=154">Issue 154</a>: 在重连本地memcached的时候，有可能出现重连无法成功的情况，导致连接丢失，详情见<a href="http://code.google.com/p/xmemcached/issues/detail?id=154">这里</a>。<br /><a href="http://code.google.com/p/xmemcached/issues/detail?id=155">Issue 155:</a> 重连导致文件句柄数超过限制的bug，这是由于重连失败情况下没有合理关闭socket引起的，详情见<a href="http://code.google.com/p/xmemcached/issues/detail?id=155">这里</a>。<br /><br />&nbsp;&nbsp;&nbsp; 如果你使用maven，简单升级版本即可：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">com.googlecode.xmemcached</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">xmemcached</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">1.3.5</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div><br /><br />&nbsp;&nbsp;&nbsp; 下载地址：<a href="http://code.google.com/p/xmemcached/downloads/list">http://code.google.com/p/xmemcached/downloads/list</a><br /><br />&nbsp;&nbsp;&nbsp; 此版本推荐升级，最后感谢两位老外开发者的帮助： 
 <a style="white-space: nowrap" href="http://code.google.com/u/ilkinulas/">ilkinulas</a>和<a href="http://code.google.com/u/@VBZVQFxQBxJNXgV0/">MrRubato</a><img src ="http://www.blogjava.net/killme2008/aggbug/359898.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-10-01 15:11 <a href="http://www.blogjava.net/killme2008/archive/2011/10/01/359898.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UniqTask for android</title><link>http://www.blogjava.net/killme2008/archive/2011/09/20/359033.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 19 Sep 2011 20:10:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/09/20/359033.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/359033.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/09/20/359033.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/359033.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/359033.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 好吧，我知道现在是凌晨4点了，写完这个就睡觉。<br /><br />&nbsp;&nbsp;&nbsp; 我一直很不爽android的ES任务管理器，它的广告设置的地方非常恶心，就放在kill键的下面，而且每次都突然跳出来，让你很容易错误点击。我很佩服他们能想出这种提高点击率的办法，但是又无比鄙视这种做法。今天（哦，不是昨天）晚上在twitter上说了，我想自己写个任务管理器，类似ES任务管理器，并且没有广告。那好吧，说干就干，奋斗了一个晚上，终于搞出了成果，这就是隆重登场的UniqTask，先看看运行时截图：<br /><br /><div align="center"><img alt="" src="http://www.blogjava.net/images/blogjava_net/killme2008/SC20110920-040819.png" height="800" width="480" /></div><br /><br />&nbsp;&nbsp;&nbsp; 这是运行在我的GS2上的截图。<br /><br />&nbsp;&nbsp;&nbsp; UniqTask的功能跟ES任务管理器的功能完全一致，可以记录kill的历史，每次启动UniqTask的时候自动标记过去kill过的进程。但是UniqTask完全绿色无毒，绝对没有广告，咔咔。<br /><br />&nbsp;&nbsp;&nbsp; 许久没写android程序，拿起手来不是很顺利，折腾到现在才搞定，我将代码放到了github上，也提供了APK下载，非常欢迎试用啊。<br /><br />&nbsp;&nbsp;&nbsp; 源码地址：<br />&nbsp;&nbsp;&nbsp; <a href="https://github.com/killme2008/UniqTask">https://github.com/killme2008/UniqTask</a><br />&nbsp;&nbsp;&nbsp; APK下载：<br />&nbsp;&nbsp;&nbsp; <a href="https://github.com/killme2008/UniqTask/blob/master/UniqTask.apk">https://github.com/killme2008/UniqTask/blob/master/UniqTask.apk</a><br /><br />&nbsp;&nbsp;&nbsp; 白天还有重要的事情要处理，睡觉去了。<img src ="http://www.blogjava.net/killme2008/aggbug/359033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-09-20 04:10 <a href="http://www.blogjava.net/killme2008/archive/2011/09/20/359033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xmemcached发布1.3.4</title><link>http://www.blogjava.net/killme2008/archive/2011/09/08/358317.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 08 Sep 2011 10:55:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/09/08/358317.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/358317.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/09/08/358317.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/358317.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/358317.html</trackback:ping><description><![CDATA[<div id="news_content">
      <p>&nbsp;&nbsp;&nbsp; 开源的java memcached client&#8212;&#8212; <a href="http://code.google.com/p/xmemcached/">xmemcached</a>发布1.3.4版本，主要改进如下：</p>
<p>&nbsp;</p>
<p>1、修复一个相对严重的bug，在解析二进制协议时如果遇到从服务端返回的错误信息，会导致连接异常断开；如果你没有使用binary协议，不会遇到此问题。<strong><strong>建议使用xmemcached并且使用二进制协议的朋友升级到此版本</strong>。</strong></p>


<p>2、允许XMemcachedClientFactoryBean配置opTimeout选项。 <br /></p>
<p>3、添加RoundRobinMemcachedSessionLocator，轮询的连接选择器，仅用于kestrel或者memcacheq集群，这些应用都不要求同一个key要保存在固定的服务器上，而仅是作为集群分担负载。</p>

<p>4、<a href="http://xmemcached.googlecode.com/svn/trunk/apidocs/net/rubyeye/xmemcached/impl/KetamaMemcachedSessionLocator.html">KetamaMemcachedSessionLocator</a>添加额外选项，允许配置是否兼容 <a href="https://github.com/dctrwatson/nginx-upstream-consistent">nginx-upstream-consistent</a>，这个是网友<strong> </strong> 
 <span>
 <a href="http://code.google.com/u/wolfg1969/">wolfg1969</a>贡献的patch。如果要使得xmc的一致性哈希算法兼容</span>nginx-upstream-consistent，只要设置cwNginxUpstreamConsistent为true即可，示范代码：</p>

<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;MemcachedClientBuilder&nbsp;builder&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;XMemcachedClientBuilder(&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddrUtil.getAddresses(servers));&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;builder.setSessionLocator(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;KetamaMemcachedSessionLocator(&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">));&nbsp; <br /></span></div><p>5、修复bug，包括<a class="closed_ref" title="Typo in INFO message: log.info(&quot;Creating &quot; + selectorPoolSize + &quot; rectors...&quot;);" href="http://code.google.com/p/xmemcached/issues/detail?id=132">issue 132&nbsp;</a>,<a class="closed_ref" title="Counter的问题，请确认是否为BUG" href="http://code.google.com/p/xmemcached/issues/detail?id=142">&nbsp;issue 142&nbsp;</a>,<a class="closed_ref" title="XMemcachedClientFactoryBean doesn't allow overriding of certain client properties" href="http://code.google.com/p/xmemcached/issues/detail?id=133">&nbsp;issue 133&nbsp;</a>,<a class="closed_ref" title="Network layout exception" href="http://code.google.com/p/xmemcached/issues/detail?id=139">&nbsp;issue 139&nbsp;</a>,<a class="closed_ref" title="Counter的问题，请确认是否为BUG" href="http://code.google.com/p/xmemcached/issues/detail?id=142">&nbsp;issue 142&nbsp;</a>,<a class="closed_ref" title="为配合nginx-upstream-consistent模块做了一个patch" href="http://code.google.com/p/xmemcached/issues/detail?id=145">&nbsp;issue 145&nbsp;</a>,<a title="Throw &quot;Not a proper response&quot; MemcachedException when using binary protocol" href="http://code.google.com/p/xmemcached/issues/detail?id=150">issue 150</a>等。</p>
<p>&nbsp;</p>
<p>如果你使用maven，只要简单升级版本即可：&nbsp; <br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">com.googlecode.xmemcached</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">xmemcached</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">1.3.4</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">&nbsp; <br /></span></div><p>下载地址：</p>
<p><a href="http://code.google.com/p/xmemcached/downloads/list">http://code.google.com/p/xmemcached/downloads/list</a></p>
    </div><img src ="http://www.blogjava.net/killme2008/aggbug/358317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-09-08 18:55 <a href="http://www.blogjava.net/killme2008/archive/2011/09/08/358317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>A clojure DSL for system admin and deployment with many remote machines</title><link>http://www.blogjava.net/killme2008/archive/2011/07/24/354938.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sun, 24 Jul 2011 13:48:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/07/24/354938.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/354938.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/07/24/354938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/354938.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/354938.html</trackback:ping><description><![CDATA[<strong>update: Allow passing command line arguments to task now.<br /><br />1.What is clojure-control?
</strong><br /> <p>&nbsp;&nbsp;&nbsp; The idea came from <a href="https://github.com/tsmith/node- control">node-control</a>.
<br /> &nbsp;&nbsp;&nbsp; Define clusters and tasks for system administration or code deployment, then execute them on one or many remote machines.
<br /> &nbsp;&nbsp;&nbsp; Clojure-control depends only on OpenSSH and clojure on the local
control machine.Remote machines simply need a standard sshd daemon.
<br /> </p><p><strong>2.Quick example
</strong><br /> </p><p>Get the current date from the two machines listed in the 'mycluster'&nbsp; config with a single command: <br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ns&nbsp;samples<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(:use&nbsp;[control.core&nbsp;:only&nbsp;[task&nbsp;cluster&nbsp;scp&nbsp;ssh&nbsp;begin]]))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;define&nbsp;clusters<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cluster&nbsp;:mycluster<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:clients&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;:host&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">a.domain.com</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;:user&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">alogin</span><span style="color: #000000; ">"</span><span style="color: #000000; ">}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;:host&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">b.domain.com</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;:user&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">blogin</span><span style="color: #000000; ">"</span><span style="color: #000000; ">}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;define&nbsp;tasks<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(task&nbsp;:date&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Get&nbsp;date</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; []<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ssh&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">date</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br />&nbsp;&nbsp;&nbsp;&nbsp;;;start&nbsp;running<br />&nbsp;&nbsp;&nbsp;&nbsp;(begin) <br /></span></div><p>&nbsp;&nbsp;&nbsp; If saved in a file named "controls.clj",run with
&nbsp;&nbsp; <br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">java&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">cp&nbsp;clojure.jar:clojure</span><span style="color: #000000; ">-</span><span style="color: #000000; ">contrib.jar:control</span><span style="color: #000000; ">-</span><span style="color: #000000; ">0.1</span><span style="color: #000000; ">-</span><span style="color: #000000; ">SNAPSHOT.jar&nbsp;clojure.main&nbsp;controls.clj&nbsp;mycluster&nbsp;date <br /></span></div><p> </p><p>&nbsp;&nbsp;&nbsp; Each machine execute "date" command ,and the output form the remote
machine is printed to the console.Exmaple console output
<br /> </p><p>&nbsp;</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;Performing&nbsp;mycluster<br />&nbsp;&nbsp;&nbsp;&nbsp;Performing&nbsp;date&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;a.domain.com<br />&nbsp;&nbsp;&nbsp;&nbsp;a.domain.com:ssh:&nbsp;date<br />&nbsp;&nbsp;&nbsp;&nbsp;a.domain.com:stdout:&nbsp;Sun&nbsp;Jul&nbsp;</span><span style="color: #000000; ">24</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">19</span><span style="color: #000000; ">:</span><span style="color: #000000; ">14</span><span style="color: #000000; ">:</span><span style="color: #000000; ">09</span><span style="color: #000000; ">&nbsp;CST&nbsp;</span><span style="color: #000000; ">2011</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;a.domain.com:exit:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;Performing&nbsp;date&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;b.domain.com<br />&nbsp;&nbsp;&nbsp;&nbsp;b.domain.com:ssh:&nbsp;date<br />&nbsp;&nbsp;&nbsp;&nbsp;b.domain.com:stdout:&nbsp;Sun&nbsp;Jul&nbsp;</span><span style="color: #000000; ">24</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">19</span><span style="color: #000000; ">:</span><span style="color: #000000; ">14</span><span style="color: #000000; ">:</span><span style="color: #000000; ">09</span><span style="color: #000000; ">&nbsp;CST&nbsp;</span><span style="color: #000000; ">2011</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;b.domain.com:exit:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; "> <br /></span></div><p>&nbsp;&nbsp;&nbsp; Each line of output is labeled with the address of the machine the
command was executed on. The actual command sent and the user used to
send it is displayed. stdout and stderr output of the remote process
is identified as well as the final exit code of the local ssh
command.
<br /> </p><p><strong><br /></strong></p><p><strong>3.How to scp files?
</strong><br /> &nbsp;&nbsp;&nbsp; Let's define a new task named deploy
<br /> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;(task&nbsp;:deploy&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">scp&nbsp;files&nbsp;to&nbsp;remote&nbsp;machines</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; []<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(scp&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">release1.tar.gz</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">release2.tar.gz</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/home/alogin/</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)) <br /></span></div><p> </p><p>&nbsp;&nbsp;&nbsp; Then it will copy release1.tar.gz and release2.tar.gz to remote
machine's /home/alogin directory.
<br /> </p><p><strong>4.Where is it?</strong><br /> </p>&nbsp;&nbsp;&nbsp; It's on github,<a title="https://github.com/killme2008/clojure-control" href="https://github.com/killme2008/clojure-control">https://github.com/killme2008/clojure-control</a><br /><br />&nbsp;&nbsp;&nbsp; Any suggestion or bug reports welcomed.<img src ="http://www.blogjava.net/killme2008/aggbug/354938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-07-24 21:48 <a href="http://www.blogjava.net/killme2008/archive/2011/07/24/354938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>轻量级高性能的表达式求值器——aviator发布2.0</title><link>http://www.blogjava.net/killme2008/archive/2011/07/13/354296.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Wed, 13 Jul 2011 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/07/13/354296.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/354296.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/07/13/354296.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/354296.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/354296.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://code.google.com/p/aviator/">aviator</a>是一个轻量级的、高性能的Java表达式求值器，主要应用在如工作流引擎节点条件判断、MQ中的消息过滤以及某些特定的业务场景。</p>
<p>&nbsp;&nbsp;&nbsp; 自从上次发布1.0后，还发过1.01版本，不过都没怎么宣传。这次发布一个2.0的里程碑版本，主要改进如下：</p>
<br />
<p>1、完整支持位运算符，与java完全一致。位预算符对实现bit set之类的需求还是非常必须的。 <br />
</p>
<p>2、性能优化，平均性能提升100%，函数调用性能提升200%，最新的与groovy和JEXL的性能测试看这里</p>
<p><a href="http://code.google.com/p/aviator/wiki/Performance">http://code.google.com/p/aviator/wiki/Performance</a> <br />
</p>
<p>3、添加了新函数，包括long、double、str用于类型转换，添加了string.indexOf函数。</p>
<p>4、完善了用户手册，更新性能测试。</p>
<p>&nbsp;</p>
<p>下载地址：&nbsp;<a href="http://code.google.com/p/aviator/downloads/list"> http://code.google.com/p/aviator/downloads/list</a></p>
<p>项目主页：&nbsp; <a href="http://code.google.com/p/aviator/">http://code.google.com/p/aviator/</a></p>
<p>用户指南：&nbsp; <a href="http://code.google.com/p/aviator/w/list">http://code.google.com/p/aviator/w/list</a></p>
<p>性能报告：&nbsp; <a href="http://code.google.com/p/aviator/wiki/Performance">http://code.google.com/p/aviator/wiki/Performance</a></p>
<p>源码：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://github.com/killme2008/aviator">https://github.com/killme2008/aviator</a></p>
<p>&nbsp;</p><p>Maven引用（感谢许老大的帮助）：</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">com.googlecode.aviator</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">aviator</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">2.0</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这个项目目前用在我们的MQ产品中做消息过滤，也有几个公司外的用户告诉我他们也在用，不过估计不会很多。有这种需求的场景还是比较少的。这个项目实际上是为我们的MQ定制的，我主要想做到这么几点：</p>
<p>（1）控制用户能够使用的函数，不允许调用任何不受控制的函数。</p>
<p>（2）轻量级，不需要嵌入groovy这么大的脚本引擎，我们只需要一个剪裁过的表达式语法即可。</p>
<p>（3）高性能，最终的性能在某些场景比groovy略差，但是已经非常接近。</p>
<p>（4）易于扩展，可以容易地添加函数扩展功能。语法相对固定。</p>
<p>（5）函数的调用避免使用反射。因此没使用dot运算符的函数调用方式，而是更类似c语言和lua语言的函数调用风格。函数是一等公民，seq库的风格很符合我的喜好。</p>
<p>&nbsp; seq这概念来自clojure，我将实现了java.util.Collection接口的类和数组都称为seq集合，可以统一使用seq库操作。例如假设我有个list:</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;Object</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;env&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;Object</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Integer</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;list&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Integer</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span style="color: #000000; ">100</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">100</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;env.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">list</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;list);</span></div>
<br />&nbsp;&nbsp; 可以做这么几个事情，度量大小：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">count(list)</span></div>&nbsp;&nbsp; 判断元素是否存在：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">include(list,</span><span style="color: #000000; ">3</span><span style="color: #000000; ">)</span></div>&nbsp;&nbsp; 过滤元素，返回大于0的元素组成的seq：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">filter(list,seq.gt(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))<br /></span></div>&nbsp;&nbsp; 对集合里的元素求和，应用reduce:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">reduce(list,</span><span style="color: #000000; ">+</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)</span></div>&nbsp;&nbsp; 遍历集合元素并打印：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">map(list,println)</span></div>&nbsp;&nbsp; 最后，你还可以排序:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">sort(list)</span></div><br />&nbsp;&nbsp;&nbsp; 这些函数类似FP里的高阶函数，使用起来还是非常爽的。<br /><br />&nbsp;&nbsp;&nbsp; 对函数调用的优化，其实只干了一个事情，原来函数调用我是将所有参数收集到一个list里面，然后再转成数组元素交给AviatorFunction调用。这里创建了两个临时对象：list和数组。这其实是没有必要的，我只要在AviatorFunction里定义一系列重载方法，如：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;AviatorObject&nbsp;call(Map</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;Object</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;env);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;AviatorObject&nbsp;call(Map</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;Object</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;env,&nbsp;AviatorObject&nbsp;arg1);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;AviatorObject&nbsp;call(Map</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;Object</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;env,&nbsp;AviatorObject&nbsp;arg1,&nbsp;AviatorObject&nbsp;arg2);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;AviatorObject&nbsp;call(Map</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;Object</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;env,&nbsp;AviatorObject&nbsp;arg1,&nbsp;AviatorObject&nbsp;arg2,&nbsp;AviatorObject&nbsp;arg3);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span></div><br />&nbsp;&nbsp; 就不需要收集参数，而是直接invokeinterface调用AviatorFunction相应的重载方法即可。我看到在JRuby和Clojure里的方法调用都这样干的。过去的思路走岔了。最终也不需要区分内部的method和外部的function，统一为一个对象即可，进一步减少了对象创建的开销。<img src ="http://www.blogjava.net/killme2008/aggbug/354296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-07-13 22:34 <a href="http://www.blogjava.net/killme2008/archive/2011/07/13/354296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java NIO编程的技巧和陷阱</title><link>http://www.blogjava.net/killme2008/archive/2011/06/30/353422.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 30 Jun 2011 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/06/30/353422.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/353422.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/06/30/353422.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/353422.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/353422.html</trackback:ping><description><![CDATA[<br />
去年做的分享，一直上传slideshare失败，今天又试了下，成功了。这个主题主要介绍Java NIO编程的技巧和陷阱，解读了一些NIO框架的源码，以及编写高性能NIO网络框架所需要注意的技巧和缺陷。关注这方面的朋友可以看一下。去年写了篇blog提供了pdf版本的下载，看<a href="http://www.blogjava.net/killme2008/archive/2010/11/22/338420.html">这里</a>。<br />
<br />
<div style="width:500px" id="__ss_8464155"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/killme2008/nio-trick-and-trap-8464155" title="Nio trick and trap" target="_blank">Nio trick and trap</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/8464155" marginwidth="0" marginheight="0" frameborder="0" height="450" scrolling="no" width="500"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/killme2008" target="_blank">dennis zhuang</a> </div>
</div><img src ="http://www.blogjava.net/killme2008/aggbug/353422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-06-30 11:07 <a href="http://www.blogjava.net/killme2008/archive/2011/06/30/353422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xmemcached发布1.3.3版本——支持touch和GAT</title><link>http://www.blogjava.net/killme2008/archive/2011/06/12/352120.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sun, 12 Jun 2011 05:32:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/06/12/352120.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/352120.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/06/12/352120.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/352120.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/352120.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 开源memcached的java客户端<a href="http://code.google.com/p/xmemcached/">xmemcached</a>发布1.3.3，主要改进如下：<br /><br />1、memcached 1.6添加了不少新特性，具体可以参考《what's new in memcached》(<a href="http://groups.google.com/group/memcached/browse_thread/thread/10253a6996735f2">1</a>) (<a href="http://groups.google.com/group/memcached/browse_thread/thread/4041bead80c8f14c">2</a>)这两个帖子。xmemcached将及时跟进这些新特性。1.3.3这个版本<strong>实现了二进制协议中新的两个命令touch和GAT</strong>（get and touch)。这两个功能可以说是千呼万唤始出来，终于可以不用get-set来重新设置数据的超时时间，利用touch或者GAT可以简单地更新数据的超时时间。1.3.3新增加四个方法：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;touch(</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;key,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;exp,&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;opTimeout)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000;">&nbsp;TimeoutException,&nbsp;InterruptedException,&nbsp;MemcachedException;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;touch(</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;key,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;exp)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;TimeoutException,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InterruptedException,&nbsp;MemcachedException;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;T&nbsp;getAndTouch(</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;key,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;newExp,&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;opTimeout)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;TimeoutException,&nbsp;InterruptedException,&nbsp;MemcachedException;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;T&nbsp;getAndTouch(</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;key,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;newExp)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000;">&nbsp;TimeoutException,&nbsp;InterruptedException,&nbsp;MemcachedException;</span></div><br />其中touch用于设置数据新的超时时间，getAndTouch则是在获取数据的同时更新超时时间。例如用memcached存储session，可以在每次get的时候更新下数据的超时时间来保活。<strong>请注意，这四个方法仅在使用memcached 1.6并且使用二进制协议的时候有效</strong>。<br /><strong><br />2、setLoggingLevelVerbosity方法可以作用于二进制协议。</strong><br /><strong><br />3、重构错误处理模块，使得异常信息更友好。</strong><br /><br /><strong>4、将KeyIterator和getKeyIterator声明为deprecated，</strong>因为memached 1.6将移除stats cachedump协议，并且stats cachedump返回数据有大小限制，遍历功能不具实用性。<br /><br /><strong>5、修复Bug</strong>，包括<a title="Error getting memcached Detail Statistics" class="closed_ref" href="http://code.google.com/p/xmemcached/issues/detail?id=126">issue 126&nbsp;</a>,<a title="Unknow Response status:130" href="http://code.google.com/p/xmemcached/issues/detail?id=127">issue 127</a>,<a title="&quot;SERVER_ERROR out of memory storing object&quot; cause session disconnected" href="http://code.google.com/p/xmemcached/issues/detail?id=128">issue 128</a>,<a title="Memory leak after shutdown" href="http://code.google.com/p/xmemcached/issues/detail?id=129">issue 129</a>。<br /><br />下载地址：<a href="http://code.google.com/p/xmemcached/downloads/list">http://code.google.com/p/xmemcached/downloads/list</a><br />源码：&nbsp; <a href="https://github.com/killme2008/xmemcached">https://github.com/killme2008/xmemcached</a><br />maven引用：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">com.googlecode.xmemcached</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">xmemcached</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">1.3.3</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div><img src ="http://www.blogjava.net/killme2008/aggbug/352120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-06-12 13:32 <a href="http://www.blogjava.net/killme2008/archive/2011/06/12/352120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Zookeeper的web管理应用</title><link>http://www.blogjava.net/killme2008/archive/2011/06/06/351793.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sun, 05 Jun 2011 17:13:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/06/06/351793.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/351793.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/06/06/351793.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/351793.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/351793.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; Update: 如果遇到在search不存在的path报段错误，这是node-zookeeper的一个bug，我暂时修复了下并提交了pull request，你可以暂时用我修改的node-zookeeper &nbsp;<a href="https://github.com/killme2008/node-zookeeper">https://github.com/killme2008/node-zookeeper<br /></a><br />&nbsp;&nbsp;&nbsp; 我们已经开始在产品使用<a href="http://zookeeper.apache.org/">zookeeper</a>了，那么维护工具也必然需要，所谓兵马未动，粮草先行。请同事帮忙看过几个开源项目后，并没有特别让人满意的。<br />&nbsp;&nbsp;&nbsp; 我想要的功能比较简单。首先，希望能将zookeeper集群的数据展示为树形结构，跟zookeeper模型保持一致。可以逐步展开每层的节点，每次展开都是延迟加载从zk里取数据，这样不会对zk造成太大压力。其次，除了展示树形结构外，我还希望它能展示每个path的属性和数据，更进一步，如果数据是文本的，我希望它可编辑。当然，因为编辑功能是比较危险的行为，我还希望这个管理工具有个简单的授权验证机制。<br /><br />&nbsp;&nbsp;&nbsp; 最终，我自己写了这么个东西，取名为<a href="https://github.com/killme2008/node-zk-browser">node-zk-browser</a>，基于node.js的<a href="http://expressjs.com/">express.js</a>框架和<a href="https://github.com/yfinkelstein/node-zookeeper">node-zookeeper</a>客户端实现的。我将它放在了github上<br /><br />&nbsp;&nbsp;&nbsp;<a href="https://github.com/killme2008/node-zk-browser"> https://github.com/killme2008/node-zk-browser</a><br /><br />&nbsp;&nbsp;&nbsp; 你可以自己搭建这个小app， npm几乎能帮你搞定大部分工作。界面不美观，实用为主，几张运行时截图<br /><br /><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/killme2008/zk1.png" height="494" width="531" /><br /><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/killme2008/zk2.png" height="579" width="618" /><br /><br /><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/killme2008/zk3.png" height="187" width="639" /><img src ="http://www.blogjava.net/killme2008/aggbug/351793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-06-06 01:13 <a href="http://www.blogjava.net/killme2008/archive/2011/06/06/351793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>node-leveldb的memcached adapter</title><link>http://www.blogjava.net/killme2008/archive/2011/05/31/351447.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 31 May 2011 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/05/31/351447.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/351447.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/05/31/351447.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/351447.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/351447.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; <a href="http://code.google.com/p/leveldb/">leveldb</a>是google最近开源的一个实现，但是它仅是个lib，还需要包装才能使用。<a href="https://github.com/creationix/node-leveldb">node-leveldb</a>就是一个用node.js包装leveldb的项目，你可以用javascript访问leveldb。<a href="https://github.com/creationix/node-leveldb">node-leveldb</a>仅提供API，不提供网络接口供外部访问。我fork了个分支，搞了个memcached的adapter，将node-leveldb的API暴露为memcached的文本协议，这样一来你可以直接用现有的memcached client甚至直接telnet上去进行测试。感兴趣的朋友可以测试下。adpater就一个文件<a href="https://github.com/killme2008/node-leveldb/blob/master/memcached-adapter/memcached.js">memcached.js</a>。<br />&nbsp; &nbsp;&nbsp;<br />&nbsp; &nbsp; fork的分支在：<br />&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://github.com/killme2008/node-leveldb" title="https://github.com/killme2008/node-leveldb">https://github.com/killme2008/node-leveldb<br /><br /></a>&nbsp;&nbsp;&nbsp;&nbsp;编译node-leveldb之后，执行<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">node&nbsp;memcached</span><span style="color: #000000; ">-</span><span style="color: #000000; ">adpater</span><span style="color: #000000; ">/</span><span style="color: #000000; ">memcached.js</span></div><br />&nbsp; &nbsp; 即可启动memcached adapter在11211端口，你可以telnet上去测试。目前仅支持get/set/delete/quit协议，不支持flag和exptime。<br /><img src ="http://www.blogjava.net/killme2008/aggbug/351447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-05-31 16:45 <a href="http://www.blogjava.net/killme2008/archive/2011/05/31/351447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HandlerSocket client for java——hs4j正式发布0.1版本</title><link>http://www.blogjava.net/killme2008/archive/2011/03/29/347160.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 28 Mar 2011 22:55:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/03/29/347160.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/347160.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/03/29/347160.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/347160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/347160.html</trackback:ping><description><![CDATA[<br />
<br />
&nbsp;&nbsp;&nbsp; <a href="https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL">HandlerSocket</a>是一个mysql插件，可以将mysql作为NoSQL来使用，具体可以看我过去写的<a href="http://www.blogjava.net/killme2008/default.html?page=2">这篇Blog</a>。<a href="http://code.google.com/p/hs4j/">hs4j</a>是HandlerSocket的一个java客户端，自认为它比日本人写的那个客户端更实用和易用一些。写完好久，经过不少朋友使用和测试，现在正式发一个0.1版本，并已同步到maven中心仓库。<br />
<br />
&nbsp;&nbsp;&nbsp; 项目主页：<a title="http://code.google.com/p/hs4j/" href="http://code.google.com/p/hs4j/">http://code.google.com/p/hs4j/</a><br />
&nbsp;&nbsp;&nbsp; 项目描述：hs4j is a practical java client for <a href="https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL" rel="nofollow">HandlerSocket</a>,it is nio based and turned to get better performance. <br />
&nbsp;&nbsp;&nbsp; 使用文档：<a href="http://code.google.com/p/hs4j/w/list">http://code.google.com/p/hs4j/w/list</a><br />
&nbsp;&nbsp;&nbsp; 下载地址：<a title="http://code.google.com/p/hs4j/downloads/list" href="http://code.google.com/p/hs4j/downloads/list">http://code.google.com/p/hs4j/downloads/list</a><br />
&nbsp;&nbsp;&nbsp; 源码仓库：<a href="https://github.com/killme2008/hs4j" rel="nofollow">https://github.com/killme2008/hs4j</a><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 如果你使用maven2，可以直接引用：<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">dependency</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">com.googlecode.hs4j</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">hs4j</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">version</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">0.1</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">version</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">dependency</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 有疑问和bug请联系我。<br /><img src ="http://www.blogjava.net/killme2008/aggbug/347160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-03-29 06:55 <a href="http://www.blogjava.net/killme2008/archive/2011/03/29/347160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xmemcached发布1.3.2版本</title><link>http://www.blogjava.net/killme2008/archive/2011/03/27/347102.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sun, 27 Mar 2011 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/03/27/347102.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/347102.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/03/27/347102.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/347102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/347102.html</trackback:ping><description><![CDATA[<p><a href="http://code.google.com/p/xmemcached">&nbsp;&nbsp;&nbsp;&nbsp; Xmemcached</a>是一个开源的java memcached client，具有高性能、更易用、功能完善等优点，距离上次发布1.3.1已经超过两个月，现在正式发布1.3.2这个新版本，主要的改进如下：</p>
<br />
<strong>1、Bug修复</strong>，从1.3.1版本以来发现的bug并修复，包括：
<p><a href="http://code.google.com/p/xmemcached/issues/detail?id=112">issue 112</a>:: 新引入的failure模式在启动的时候，如果memcached故障，运行不符合预期的bug.</p>
<p><a href="http://code.google.com/p/xmemcached/issues/detail?id=113">issue 113</a>: 新增加一个delete方法，可以设置操作超时</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;delete(</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String&nbsp;key,&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;opTimeout)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;TimeoutException,&nbsp;InterruptedException,&nbsp;MemcachedException;<br />
<br />
</span></div>
<p><strong>2、性能调优</strong>，存储操作(set/add/replace/prepend/append/cas)的性能提升5%。</p>
<p><strong>3、修复pom.xml</strong>，使得xmemcached可以在其他机器上编译。</p>
<p><strong>4、使用github作为源码仓库</strong>，版本管理使用git替换svn，源码转移到</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://github.com/killme2008/xmemcached">https://github.com/killme2008/xmemcached</a></p>
<p>新版本下载地址：</p>
<a href="http://code.google.com/p/xmemcached/downloads/list">&nbsp;&nbsp;&nbsp; http://code.google.com/p/xmemcached/downloads/list</a>
<p>使用maven可以直接引用：&nbsp;
</p>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">&gt;</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">com.googlecode.xmemcached</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">xmemcached</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">1.3.2</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span></div>
<p>项目文档：</p>
<p><a href="http://code.google.com/p/xmemcached/w/list">http://code.google.com/p/xmemcached/w/list</a></p><img src ="http://www.blogjava.net/killme2008/aggbug/347102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-03-27 14:06 <a href="http://www.blogjava.net/killme2008/archive/2011/03/27/347102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Scheme interpreter in clojure</title><link>http://www.blogjava.net/killme2008/archive/2011/01/24/343423.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 24 Jan 2011 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/01/24/343423.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/343423.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/01/24/343423.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/343423.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/343423.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 昨天晚上用clojure搞了个scheme解释器，基本上是sicp里的解释器的clojure翻译版本，可能唯一值的一提的是对transient集合的使用，实现副作用的set!。总共代码包含注释才366行，支持的feature包括<br />
<br />
<table class="wiki-content-table" border="2" bordercolor="" cellpadding="" cellspacing="">
    <tbody>
        <tr>
            <th>Feature</th>
            <th>Supported</th>
            <th>Comment</th>
        </tr>
        <tr>
            <td>define</td>
            <td>yes</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>lambda</td>
            <td>yes</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>variable lookup</td>
            <td>yes</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>primitive procedure evaluation</td>
            <td>yes</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>compound procedure evaluation</td>
            <td>yes</td>
            <td>no tail recursion yet</td>
        </tr>
        <tr>
            <td>if</td>
            <td>yes</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>cond</td>
            <td>yes</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>let</td>
            <td>yes<br />
            </td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>let*</td>
            <td>yes<br />
            </td>
            <td>no named let* yet<br />
            </td>
        </tr>
        <tr>
            <td>letrec</td>
            <td>no</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>begin</td>
            <td>yes<br />
            </td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>set!</td>
            <td>yes<br />
            </td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>quote</td>
            <td>yes</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>quasiquote</td>
            <td>no</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>unquote</td>
            <td>no</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>delay</td>
            <td>no</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>define-syntax</td>
            <td>no</td>
            <td><br />
            </td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 支持的primitive procedure包括常见的四则运算、car/cdr、list以及display、newline等。代码放在了github上：<a href="https://github.com/killme2008/cscheme">https://github.com/killme2008/cscheme</a>,有兴趣的可以玩玩吧。<br /><img src ="http://www.blogjava.net/killme2008/aggbug/343423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-01-24 10:42 <a href="http://www.blogjava.net/killme2008/archive/2011/01/24/343423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Xmemcached 1.3.0正式发布</title><link>http://www.blogjava.net/killme2008/archive/2011/01/04/342287.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 04 Jan 2011 12:10:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2011/01/04/342287.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/342287.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2011/01/04/342287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/342287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/342287.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://code.google.com/p/xmemcached/">Xmemcached</a>是一个开源的memcached的Java客户端，最近引入了一些关键特性，因此版本号直接从1.2.6.2升级到1.3.0。主要的更改如下：<br />
<p>
<strong>1、引入了failure模式</strong>，所谓failure模式是指在当一个memcached由于各种原因不可用的情况下，发往这个节点的请求将直接抛出异常，而非使用下一个可用的节点。具体可以看memached的<a href="http://code.google.com/p/memcached/wiki/NewConfiguringClient#Failure,_or_Failover">这个文档</a>。默认不启用，启用failure模式很简单：</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">MemcachedClientBuilder&nbsp;builder</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8230;&#8230;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">启用failure模式。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">builder.setFailureMode(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
</span></div>
<p>也可以采用spring配置。<br />
</p>
<strong>2、在启用failure模式的情况下，允许为每个memcached设置一个备份节点，</strong>当主节点挂掉的情况下，会将请求转交给备份节点，主节点恢复后又自动切换到主节点。请注意，要设置备份节点的前提是启用failure模式。假设我们已经有两个memcached节点：host1:port和host2:port，为host1:port设置一个备份节点host3:port可以实现为：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">MemcachedClientBuilder&nbsp;builder</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;XmemcachedClientBuilder(AddrUtil.getAddressMap(</span><span style="color: #000000;">"</span><span style="color: #000000;">host1:port,host3:port&nbsp;host2:port</span><span style="color: #000000;">"</span><span style="color: #000000;">))<br />
&#8230;&#8230;</span></div>
<br />
主备节点之间用逗号隔开，不同分组之间用空格隔开，完全兼容1.2。并且当备份节点连接意外断开的情况下，xmemcached也会自动修复备份节点的连接并加入映射。<br />
<p>
关于failure模式和standby节点更多内容可以参考<a href="http://www.blogjava.net/killme2008/archive/2010/12/28/341731.html">这篇blog</a>.<br />
</p>
<p>
<strong>3、修正BUG和新功能</strong>，包括<a href="http://code.google.com/p/xmemcached/issues/detail?id=104">issue 104</a>,<a href="http://code.google.com/p/xmemcached/issues/detail?id=105">issue 105</a>,<a href="http://code.google.com/p/xmemcached/issues/detail?id=107">issue 107</a>等。<br />
</p>
<p>
项目主页 <a href="http://code.google.com/p/xmemcached/" title="http://code.google.com/p/xmemcached/">http://code.google.com/p/xmemcached/</a><br />
</p>
<p>
下载地址 <a href="http://code.google.com/p/xmemcached/downloads/list" title="http://code.google.com/p/xmemcached/downloads/list">http://code.google.com/p/xmemcached/downloads/list</a><br />
</p>
<p>
用户指南 <a href="http://code.google.com/p/xmemcached/wiki/TableOfContents" title="http://code.google.com/p/xmemcached/wiki/TableOfContents">http://code.google.com/p/xmemcached/wiki/TableOfContents</a><br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;
如果你使用maven构建，可以直接引用：<br />
</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">com.googlecode.xmemcached</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">xmemcached</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">1.3.1</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">&gt;</span></div>
<p><br />
</p>
<p>&nbsp;&nbsp;&nbsp; 更新：发布1.3.1了，如果你还在使用1.3.0，建议升级。1.3.0因为改变了memcached地址服务器顺序，可能导致原有的缓存失效。<br />
</p>
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/342287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2011-01-04 20:10 <a href="http://www.blogjava.net/killme2008/archive/2011/01/04/342287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Xmemcached 1.3预览：failure模式和standby节点</title><link>http://www.blogjava.net/killme2008/archive/2010/12/28/341731.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 28 Dec 2010 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2010/12/28/341731.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/341731.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2010/12/28/341731.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/341731.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/341731.html</trackback:ping><description><![CDATA[<br />
&nbsp;&nbsp;&nbsp; <a href="http://code.google.com/p/xmemcached/">Xmemcached</a>在元旦左右准备发1.3这个版本，这个版本新增加的一个关键特性就是所谓的failure模式。关于这个，可以看下memcached官方文档的解释<br />
<a title=" 《Failure,or Failover》" href="http://code.google.com/p/memcached/wiki/NewConfiguringClient#Failure,_or_Failover"> 《Failure,or Failover》</a>。<br />
<br />
&nbsp;&nbsp;&nbsp; 展开来说，在某个memcached节点挂掉或者由于其他故障连接断开的时候，大部分客户端的默认策略都是failover的，也就是会查找下一个可用的memcached节点继续使用，挂掉或者连接不上的节点的数据会转移到其他节点上，路由的策略可以是Round Robin，也可以是一致性哈希。这样的模式在节点意外故障挂掉的情况下运行的很好，但是memached节点也完全可能因为一个意外的事故而<strong>短暂</strong>挂掉，比如你不小心弄掉了网线又马上接上去，比如机房交换机突然停电又立即恢复了，假设在故障前，用户A正要更新数据到节点A，节点A意外断开，那么这些数据就更新到下一个有效节点B，但是节点A又马上恢复，这时候用户又从节点A去读数据，读到却是更新前的老数据了（新数据更新到B节点去了），这种情况对用户来说就非常困惑，你告诉我更新成功，但是看到却还是更新前的数据。<br />
<br />
&nbsp;&nbsp; 怎么解决呢？一个简单的方案就是所谓failure模式，当某个节点挂掉的时候，不会从节点列表移除，请求也不会转移到下一个有效节点，而是直接将请求置为失败，就刚才的场景来说，在用户更新数据到节点A的时候，节点A意外断开，那么用户的这次更新请求不会转移到节点B，而是直接告诉用户更新失败，用户再次查询数据则绕过节点A直接查询后端存储。这种模式很适合这种节点短暂不可用的状况，请求会穿透缓存到后端，但是避免了新旧数据的问题。<br />
&nbsp;&nbsp;&nbsp; Xmemcached 1.3将支持failure模式，只要你设置下failureMode为true即可，简单示例：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMemcachedClientBuilder&nbsp;builder&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8230;&#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">设置使用failure模式</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.setFailureMode(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在此模式下，某个节点挂掉的情况下，往这个节点的请求都将直接抛出MemcachedException的异常。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不仅如此，xmemcached 1.3还将引入standby node的概念，你可以设置某个memached节点的备份节点，当这个节点挂掉的时候会将请求转发给这个备份节点，不会简单地抛出异常，也不会转发给其他节点。要使用standby node，必须首先设置使用failure mode，一个例子：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">XMemcachedClientBuilder&nbsp;builder&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;XMemcachedClientBuilder(AddrUtil<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getAddressMap(</span><span style="color: #000000;">"</span><span style="color: #000000;">192.168.1.99:11211,192.168.1.100:11211&nbsp;192.168.1.101:11211,192.168.1.102:11211</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
builder.setFailureMode(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);</span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 可以看到，新的服务器字符串格式变化为host:port,host:port host:port,host:port的格式，以空格隔开的是两个节点组成的一个分组，以逗号隔开的是主节点和备份节点，以上面的例子来说，我们设置客户端使用的节点是192.168.1.99和192.168.1.101，其中99对应的备份节点是100，而101的备份节点是102。并且我们需要设置使用failure mode为true。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; Failure mode加上standby节点可以比较好的解决新旧数据的问题，并且也可以防止请求穿透缓存到DB，但是主备两个节点之间的数据同步，xmemcached不准备帮你做，我的建议是可以使用repcached这个patch做复制。<br />
&nbsp;&nbsp;&nbsp; 有的朋友可能希望，在使用备份节点之前先flush掉备份节点的数据，防止使用到老的数据，请求还是可以穿透缓存去DB查找，并存储到备份节点，我仔细考虑了这个方案，衡量之下还是不准备做自动flush，主要是并发上很难处理，并且flush数据这个事情可以手工来搞，根据我的经验，做的太透明太自动不一定是好事。你可以在主节点恢复之后，手工flush下备份节点的数据。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 目前，xmemcached 1.3已经整装待发，对这些特性有兴趣的朋友可以先从<a href="http://code.google.com/p/xmemcached/source/checkout">svn下载源</a>码尝鲜，有任何改进的建议请发邮件给我。我的邮件地址在博客的右上角。<br />
<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp; <br /><img src ="http://www.blogjava.net/killme2008/aggbug/341731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2010-12-28 10:47 <a href="http://www.blogjava.net/killme2008/archive/2010/12/28/341731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HandlerSocket client for java——MySql as NoSQL</title><link>http://www.blogjava.net/killme2008/archive/2010/11/30/339386.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 30 Nov 2010 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2010/11/30/339386.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/339386.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2010/11/30/339386.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/339386.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/339386.html</trackback:ping><description><![CDATA[<br />
&nbsp;&nbsp;&nbsp; <a href="https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL">HandlerSocket</a>是日本人 akira higuchi 写的一个MySql的插件，通过这个插件，你可以直接跟MySql后端的存储引擎做key-value式的交互，省去了MySql上层的SQL解释、打开关闭表、创建查询计划等CPU消耗型的开销，按照作者给出的数据可以在数据全部在内存的情况下可以达到75W的QPS查询。具体信息可以看这篇<a href="http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-story-for.html?showComment=1287715880531#c2105763073739952882">Blog</a>，中文介绍可以看这篇文章《<a href="http://whitesock.javaeye.com/blog/811339">HandlerSocket in action</a>》。<br />
<br />
&nbsp;&nbsp;&nbsp; 这个东西为什么让我很激动呢？首先性能是程序员的G点，一听高性能你不由地激动，其次，这也解决了缓存跟数据库的一致性问题，因为缓存就在数据库里面，第三，这个东西不仅仅是NoSQL，简单的CRUD你可以通过HandlerSocket，但是复杂的查询你仍然可以走MySql，完全符合我们应用的场景，并且从实际测试来看，性能确实非常优秀。但是呢，这个东西的代价也少不了，例如没有权限检查（未来可能添加）；不能启用MySql的查询缓存，否则会导致数据的不一致；<strike>协议设计也不合理，使用\t做分隔符，使用\n做换行符，那么你插入或者更新的字段数据就不能含有这些字符，否则行为将不如预期。</strike><br />
<br />
&nbsp;&nbsp; <a href="https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL">HandlerSocket</a>有一个日本人的java客户端实现，我去尝试了下，结果发现这玩意完全不具实用性，封装的层次非常原始。因此我自己写了个新的客户端，这就是本文要介绍的HandlerSocket Client for Java，简称<a href="http://code.google.com/p/hs4j/">hs4j</a>，项目放在了<a href="http://code.google.com/p/hs4j/">googlecode</a>，代码的网络层复用xmemcached，重新实现了协议和上层接口，目前的状态完全可用，也希望有需要的朋友参与测试。<br />
<br />
&nbsp;&nbsp; 项目地址：<a href="http://code.google.com/p/hs4j/">http://code.google.com/p/hs4j/</a><br />
<br />
&nbsp;&nbsp;&nbsp; HS4J的使用很简单，所有的操作都通过HSClient这个接口进行，如我们创建一个客户端对象：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.google.code.hs4j.HSClient;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.google.code.hs4j.impl.HSClientImpl;<br />
<br />
&nbsp;&nbsp;&nbsp;HSClient&nbsp;hsClient&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HSClientImpl(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;InetSocketAddress(</span><span style="color: #000000;">9999</span><span style="color: #000000;">));</span></div>
<br />
&nbsp;&nbsp; 假设HandlerSocket运行在本地的9999端口，默认的9998是只读的，9999才是允许读和写。HSClient是线程安全的。<br />
<br />
&nbsp;&nbsp; 在执行操作前需要先open index：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.google.code.hs4j.IndexSession;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexSession&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;hsClient.openIndexSession(db,&nbsp;table,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">PRIMARY</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;columns);</span></div>
<br />
&nbsp;&nbsp; 其中db是数据库名,table是表名，"PRIMARY"表示使用主键索引，columns是一个字符串数组代表你要查询的字段名称。这里没有指定indexid，默认会产生一个indexid，你也可以指定indexid，返回表示一次open-index会话对象，IndexSession同样是线程安全的。<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">IndexSession&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;hsClient.openIndexSession(indexid,db,&nbsp;table,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">PRIMARY</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;columns);</span></div>
<br />
&nbsp;&nbsp; 查询操作通过find方法:<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.sql.ResultSet;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String[]&nbsp;keys&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">dennis</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">killme2008@gmail.com</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.find(keys);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(rs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">rs.getString(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;mail</span><span style="color: #000000;">=</span><span style="color: #000000;">rs.getString(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
&nbsp;&nbsp; find返回的是java.sql.ResultSet，你完全可以像使用jdbc那样去操作结果集。当然我的简单实现并不符合JDBC规范，只实现了最常见的一些方法，如getStrng、getLong等。find(keys)方法默认使用的op是"="。其他重载方法可以设置其他类型的op，统一封装为枚举类型FindOperator。<br />
<br />
&nbsp;&nbsp; 更新操作：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.google.code.hs4j.FindOperator;<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;result</span><span style="color: #000000;">=</span><span style="color: #000000;">session.update(keys,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String[]&nbsp;{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">dennis</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">test@163.com</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">109</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;},&nbsp;FindOperator.EQ);</span></div>
<br />
&nbsp;&nbsp; keys表示索引的字段列表对应的值数组，通过FindOperator.EQ比较这些值和索引，第二个参数values表示要更新的字段值，这些值跟你在open-index的时候传入的columns一一对应，最后返回作用的记录数。<br />
<br />
&nbsp;&nbsp;&nbsp; 删除操作：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;result</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.delete(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String[]&nbsp;{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">dennis</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FindOperator.EQ)</span></div>
<br />
&nbsp;&nbsp;&nbsp; HS4J同样支持连接池，可以在构建客户端的时候传入连接池大小：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">100-connections&nbsp;pool</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;HSClient&nbsp;hsClient&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HSClientImpl(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;InetSocketAddress(</span><span style="color: #000000;">9999</span><span style="color: #000000;">),</span><span style="color: #000000;">100</span><span style="color: #000000;">);</span></div>
<br />
&nbsp;&nbsp; 在open index的时候，会在连接池里所有的连接上都open。并且在连接因为意外情况（如网络错误）断开的时候，HS4J会自动重连，并在重连成功的情况下自动发送已经open的index，保证应用的操作不受重连影响。<br />
<br />
&nbsp;&nbsp;&nbsp; 因为HS4J是我在两天内写就的一个东西，可能还有不少隐藏的bug，并且HandlerSocket本身也是个新东西，如果有什么问题或者改进建议，随时欢迎告诉我，多谢。<br />
<br />
<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/339386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2010-11-30 13:51 <a href="http://www.blogjava.net/killme2008/archive/2010/11/30/339386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java NIO trick and trap</title><link>http://www.blogjava.net/killme2008/archive/2010/11/22/338420.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 22 Nov 2010 10:22:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2010/11/22/338420.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/338420.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2010/11/22/338420.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/338420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/338420.html</trackback:ping><description><![CDATA[<br />
&nbsp;&nbsp;&nbsp;&nbsp; 上周在内部做的一个Java NIO框架的实现技巧和陷阱的分享，对编写NIO网络框架有兴趣的朋友可能有点帮助，上传slideshare.net一直出错，直接提供下载吧。<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; 下载地址：<a href="http://www.blogjava.net/Files/killme2008/NIO%20trick%20and%20trap.pdf.zip">Nio Trick and Trap.pdf.zip</a><br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/killme2008/nio.png" height="576" width="808" /><br />
<br />
<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/338420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2010-11-22 18:22 <a href="http://www.blogjava.net/killme2008/archive/2010/11/22/338420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对kilim nio模块的改进</title><link>http://www.blogjava.net/killme2008/archive/2010/11/19/338504.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Fri, 19 Nov 2010 10:40:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2010/11/19/338504.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/338504.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2010/11/19/338504.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/338504.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/338504.html</trackback:ping><description><![CDATA[<br />
&nbsp;&nbsp;&nbsp; 前段时间对kilim的当前版本做了一些改进，集中在nio调度器这一块。Kilim新版本引入了nio调度器，可以跟非阻塞IO结合在一起，从这个版本开始，kilim才真正具有实用性。协程只有跟非阻塞IO结合起来才能发挥威力啊。但是Kilim的默认的nio调度器还只是使用一个nio worker做调度，这跟现有的NIO框架采用多个nio worker来提升效率比较起来相对落伍。我改进了<a href="https://github.com/killme2008/kilim/blob/master/src/kilim/nio/NioSelectorScheduler.java">NioSelectorScheduler</a>，引入了类似Netty3的boss和woker的概念，boss负责连接接入，而worker负责连接的IO读写，并且默认设置worker数目为CPU个数的两倍。经过我的测试，改进后的NIO调度器的效率远远超过了现有的调度器，有兴趣可以用netty的benchmark跑一下example里的<a title="EchoServer" href="https://github.com/killme2008/kilim/blob/master/examples/kilim/examples/EchoServer.java">EchoServer</a>。<br />
<br />
&nbsp;&nbsp;&nbsp; Kilim默认还提供了一个简易Http Server框架，但是没有提供Http Client的实现，我的另一个改进是提供了一个简易的Http Client实现，也是利用Ragel做协议解析，一个简单的使用例子如下：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;kilim.examples;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;kilim.Pausable;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;kilim.Task;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;kilim.http.HttpClient;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;kilim.http.HttpResponse;<br />
<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;SimpleHttpClient&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;SimpleTask&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;Task&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;execute()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Pausable,&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpClient&nbsp;client&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HttpClient();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpResponse&nbsp;resp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;client.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.google.com.hk/</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(resp.status());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(resp.content());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleTask&nbsp;task&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleTask();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp; 这个简陋的HttpClient目前只支持GET/POST，同时支持Http chunk编码（得益于kilim原有代码），做一些简单的HTTP调用已经足够。我尝试在一个项目里使用这个HttpClient去替代java默认的HttpURLConnection，效率有部分提升，但是同时由于大量协程存在占用了很大部分的内存，给GC也带来了不小的压力。<br />
<br />
&nbsp;&nbsp;&nbsp; 我的代码直接从kilim的主干fork出来，有兴趣可以直接git clone下来玩玩,地址&nbsp;<a title="https://github.com/killme2008/kilim" href="https://github.com/killme2008/kilim"> https://github.com/killme2008/kilim</a><br /><img src ="http://www.blogjava.net/killme2008/aggbug/338504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2010-11-19 18:40 <a href="http://www.blogjava.net/killme2008/archive/2010/11/19/338504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>