<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>totobacoo</title>
    <description></description>
    <link>http://totobacoo.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>SNA 架构下的在线人数统计</title>
        <author>totobacoo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://totobacoo.javaeye.com">totobacoo</a>&nbsp;
          链接：<a href="http://totobacoo.javaeye.com/blog/145899" style="color:red;">http://totobacoo.javaeye.com/blog/145899</a>&nbsp;
          发表时间: 2007年12月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一个 Web 系统，通常都有在线人数统计的需求。 按照常规思路应该是首先声明 HttpSessionListener<br />  <br />  然后分别在 sessionCreated、sessionDestroyed 回调方法里面做在线人数的加减法。 有过类似经历<br /><br />  的同学想必都知道，sessionCreated 回调的触发，并不是通常以为的用户客户端首次连接后发生的，而<br /><br />  是在首次真正的 session 存取操作时才真正被触发，比如：<br /><br />   HttpSession session = request.getSession();<br /><br /> 首次 session 存取操作时，才真正创建 session 实例，从而触发 sessionCreated 的监听回调。 <br /><br /><br /> 我现在的系统，学习了 SNA 的做法，完全抛弃了 session 的概念。 客户端只通过 cookie 记录用户Id<br /><br /> 之类的标识信息，用户登录后，服务端通过 cookie userId 再向 cache module 拿取用户的详细信息。<br /><br /> 这样做的目的跟 SNA 的设计目标一致，是为了以后的水平扩展。 <br /><br /> <br /> 现在面临的问题是，为了统计在线人数，我不得不在某一个全局缺省的 interceptor 里面读取 session，<br /><br /> 以触发 session 实例的创建，从而触发 sessionCreated 的监听回调。 本来系统已经实现了 SNA，完全<br /><br /> 不再需要 session了， 现在又不得不为此创建一堆无用的 session 实例。 就算现在暂时容忍了这一点，<br /><br /> 以后做节点水平扩展的时候，还得面临节点间的在线人数广播通知的问题。。。<br /><br /> <br /> 用 cookie 来解决这个问题，也不是非常的方便。 因为匿名连接，是要计入在线的。 但是初次访问的用户,<br /><br /> 并没有 userId 之类的 cookie 信息，服务端为了区分不同的匿名个体，还需要给客户端 cookie 回写一<br /> <br /> 些唯一匿名标识。 总之是很繁琐。 <br /><br /><br /> 不知道大家在处理类似 SNA 的结构方式时，怎么处理这样的问题。
          <br/>
          <span style="color:red;">
            <a href="http://totobacoo.javaeye.com/blog/145899#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Dec 2007 15:42:53 +0800</pubDate>
        <link>http://totobacoo.javaeye.com/blog/145899</link>
        <guid>http://totobacoo.javaeye.com/blog/145899</guid>
      </item>
      <item>
        <title>Quartz 执行多线程任务</title>
        <author>totobacoo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://totobacoo.javaeye.com">totobacoo</a>&nbsp;
          链接：<a href="http://totobacoo.javaeye.com/blog/91100" style="color:red;">http://totobacoo.javaeye.com/blog/91100</a>&nbsp;
          发表时间: 2007年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在项目(web)中有个需求，每天临晨对一个 WEB 目标进行页面爬取，爬取过程是一个多线程任务，这个任务由 Quartz（Spring2 整合）cronTrigger 来调度。 大概同时会派出5-10个爬虫线程，执行爬虫线程的线程池，也是由 Spring 配置的 SimpleThreadPoolTaskExecutor。 <br /><br /> 现在的情况：众所周知，Quartz 缺省维持了一组自己的线程池，default pool size = 10。 实际上我全系统只有一个任务，每天运行一次，那么，每次调度触发时，池中始终只有一个线程会被用到。 这个线程开始执行任务后， 单独配置的爬虫线程池再接着开始执行爬取任务。 <br /><br /> 现在的问题：虽然 Spring 整合了 Quartz，但是 Quartz 线程池内的线程，依然工作在容器收管之外，本身就存在私立线程的风险。除此之外，系统还为爬虫线程另外配置了一个线程池（size也是10），资源风险进一步增加。 在不否决 Quartz 方案的前提下，怎么做才能将此风险最小化？  首先我能想到的，就是将 Quartz 的 default pool size 覆盖为 1，因为全系统始终只有一个例行任务，不需要那么大的任务线程池； 另外有一个假想， 我的10个爬虫线程，能不能就从 Quartz 自带的线程池里取，不再另外为爬虫线程专门配置一个池。 因为 Quartz 自己的线程池，实际上也是一个 SimpleThreadPoolTaskExecutor。 如果这个假想可行的话，那么，Quartz 自己的线程池，既用来执行任务本身，也负责爬虫线程的执行工作。 <br /><br /> 不知道有没有朋友做过这样的尝试，有的话请不吝赐教。
          <br/>
          <span style="color:red;">
            <a href="http://totobacoo.javaeye.com/blog/91100#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 17 Jun 2007 01:45:46 +0800</pubDate>
        <link>http://totobacoo.javaeye.com/blog/91100</link>
        <guid>http://totobacoo.javaeye.com/blog/91100</guid>
      </item>
      <item>
        <title>郁闷的 Stuts2.0.6 的 package 继承的bug</title>
        <author>totobacoo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://totobacoo.javaeye.com">totobacoo</a>&nbsp;
          链接：<a href="http://totobacoo.javaeye.com/blog/89919" style="color:red;">http://totobacoo.javaeye.com/blog/89919</a>&nbsp;
          发表时间: 2007年06月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          版本：Struts 2.0.6<br /><br />struts.xml<br /><pre name="code" class="java">
&lt;package name="default" extends="struts-default">
...
&lt;/package>

&lt;include file="struts-admin.xml"/>
</pre><br /><br />struts-admin.xml<br /><pre name="code" class="java">
&lt;package name="admin" namespace="/admin" extends="default">
...
&lt;/package>
</pre><br /><br />www2 中完全没有问题的package继承配置，在 Struts 2.0.6 中如法炮制，启动时始终报错：<br />ERROR [resin-tcp-connection-*:80-5] - Unable to find parent package default<br />ERROR [resin-tcp-connection-*:80-5] - Unable to find parent packages default<br /><br />导致 struts-admin.xml 中的所有action配置都不能生效。<br /><br />反反复复查阅 struts2 的文档，始终不得其解。 ww2 -> struts2 的移植说明中，也没有提到过<br />这样的问题。 后来还是用 google 搜到了 apache 的 bug report，才知道确实是个bug，2.0.6<br />确确实实就是有package继承不能正常作用的bug。 真是郁闷之极，package继承应该是 xwork 配置<br />里面最基本的支持吧。庆幸的是，2.0.8 已经 fix 了，不然我还真不知道把所有的 action 配置都堆<br />在一个 package 里面是何其壮观。<br /><br />https://issues.apache.org/struts/browse/WW-1635<br /><br /><br />struts2 到 2.0.6 都有这样的 bug，而且所有中文文档都找不到关于这个BUG<br />的说明，哪怕问题都没找到有人提过。 我实在怀疑 struts2 到目前为止的普及率，甚至 struts2 的<br />可用性。 是否还有其他一些低级的 BUG 尚未发现？
          <br/>
          <span style="color:red;">
            <a href="http://totobacoo.javaeye.com/blog/89919#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 13 Jun 2007 23:44:32 +0800</pubDate>
        <link>http://totobacoo.javaeye.com/blog/89919</link>
        <guid>http://totobacoo.javaeye.com/blog/89919</guid>
      </item>
  </channel>
</rss>