﻿<?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-Robin's Java World-随笔分类-Flex &amp; Flash</title><link>http://www.blogjava.net/fastzch/category/43096.html</link><description>I Love Java As My Life!</description><language>zh-cn</language><lastBuildDate>Sun, 26 Sep 2010 10:28:19 GMT</lastBuildDate><pubDate>Sun, 26 Sep 2010 10:28:19 GMT</pubDate><ttl>60</ttl><item><title>使用ANT批量编译Flex应用和模块（Use ANT to batch compiling application and modules of Flex)</title><link>http://www.blogjava.net/fastzch/archive/2010/09/26/332885.html</link><dc:creator>Robin's Java World</dc:creator><author>Robin's Java World</author><pubDate>Sun, 26 Sep 2010 00:51:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2010/09/26/332885.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/332885.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2010/09/26/332885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/332885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/332885.html</trackback:ping><description><![CDATA[ANT提供了对mxmlc命令的支持，可以直接用来编译使用Flex为UI的JavaEE应用，如果你在Flex中也使用Module来作为你每个功能的组织形式，你不妨考虑用如下脚本去编译你的应用：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">target&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="compileUI"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">echo&nbsp;</span><span style="color: #ff0000">message</span><span style="color: #0000ff">="start&nbsp;to compile&nbsp;Flex&nbsp;UI"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">for&nbsp;</span><span style="color: #ff0000">param</span><span style="color: #0000ff">="file"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">path</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">fileset&nbsp;</span><span style="color: #ff0000">dir</span><span style="color: #0000ff">="${flexsrc.dir}"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">include&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="**/*.mxml"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">fileset</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">path</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">sequential</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">propertyregex&nbsp;</span><span style="color: #ff0000">override</span><span style="color: #0000ff">="yes"</span><span style="color: #ff0000">&nbsp;property</span><span style="color: #0000ff">="compile.target.name"</span><span style="color: #ff0000">&nbsp;input</span><span style="color: #0000ff">="@{file}"</span><span style="color: #ff0000">&nbsp;regexp</span><span style="color: #0000ff">="(.*)src(.*)(mxml)"</span><span style="color: #ff0000">&nbsp;replace</span><span style="color: #0000ff">="\1bin\2swf"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">mxmlc&nbsp;</span><span style="color: #ff0000">file</span><span style="color: #0000ff">="@{file}"</span><span style="color: #ff0000">&nbsp;output</span><span style="color: #0000ff">="${compile.target.name}"</span><span style="color: #ff0000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;services</span><span style="color: #0000ff">="${service.file}"</span><span style="color: #ff0000">&nbsp;context-root</span><span style="color: #0000ff">="${context.root}"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">load-config&nbsp;</span><span style="color: #ff0000">filename</span><span style="color: #0000ff">="${FLEX_HOME}/frameworks/flex-config.xml"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">static-link-runtime-shared-libraries</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">false</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">static-link-runtime-shared-libraries</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">source-path&nbsp;</span><span style="color: #ff0000">path-element</span><span style="color: #0000ff">="${flexsrc.dir}"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;use&nbsp;incremental&nbsp;compiling</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">compiler</span><span style="color: #ff0000">.incremental</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">compiler.incremental</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">compiler</span><span style="color: #ff0000">.debug</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">false</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">compiler.debug</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;指定外部依赖库文件,这些库文件将不会编译进目标SWF中&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">compiler</span><span style="color: #ff0000">.external-library-path&nbsp;dir</span><span style="color: #0000ff">="${flexlib.dir}"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">include&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="**/*.swc"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">compiler.external-library-path</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">mxmlc</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;清除缓存文件&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;delete&nbsp;file="${compile.target.name}.cache"&nbsp;/&gt;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">echo&nbsp;</span><span style="color: #ff0000">message</span><span style="color: #0000ff">="Compiled&nbsp;@{file}&nbsp;=====&gt;&gt;&nbsp;&nbsp;&nbsp;${compile.target.name}"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">sequential</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">for</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">target</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
注意事项：<br />
1，必须使用ant-contrib包来支持for任务，使用for任务时，别忘了如下声明：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">path&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="ant.classpath"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">fileset&nbsp;</span><span style="color: #ff0000">dir</span><span style="color: #0000ff">="${ant.lib.dir}"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">include&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="*.jar"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">fileset</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">path</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">taskdef&nbsp;</span><span style="color: #ff0000">resource</span><span style="color: #0000ff">="net/sf/antcontrib/antlib.xml"</span><span style="color: #ff0000">&nbsp;classpathref</span><span style="color: #0000ff">="ant.classpath"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span></div>
<br />
2，编译每个mxml时，可用propertyregex来得到output文件名，<br />
3，source-path一定不能写错，或随便写，如果这样的话，会出现如下错误：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Error: A file found in a source-path must have the same package structure<br />
4，如果在运行的过程中出现Java heap size或permGen不足的情况，可以指定如下系统参数：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ANT_OPTS=-XX:MaxPermSize=256M -Xmx1024m 
<img src ="http://www.blogjava.net/fastzch/aggbug/332885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Java World</a> 2010-09-26 08:51 <a href="http://www.blogjava.net/fastzch/archive/2010/09/26/332885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex中带有三种状态CheckBox的Tree的实现</title><link>http://www.blogjava.net/fastzch/archive/2010/09/15/332027.html</link><dc:creator>Robin's Java World</dc:creator><author>Robin's Java World</author><pubDate>Tue, 14 Sep 2010 23:58:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2010/09/15/332027.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/332027.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2010/09/15/332027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/332027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/332027.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 常常会用到带有3种状态CheckBox的树形组件，比如在权限管理中，或者是地区选择中等等，如下图：不多说费话了，直接进入主题，看看如何实现。其实在Flex中，只用自己实现一个TreeItemRenderer就可以了，代码如下：package&nbsp;com.robin&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;flash.events...&nbsp;&nbsp;<a href='http://www.blogjava.net/fastzch/archive/2010/09/15/332027.html'>阅读全文</a><img src ="http://www.blogjava.net/fastzch/aggbug/332027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Java World</a> 2010-09-15 07:58 <a href="http://www.blogjava.net/fastzch/archive/2010/09/15/332027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex4 bug -- Context Menu中菜单项Label不能带settings字样</title><link>http://www.blogjava.net/fastzch/archive/2010/05/05/320147.html</link><dc:creator>Robin's Java World</dc:creator><author>Robin's Java World</author><pubDate>Wed, 05 May 2010 12:35:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2010/05/05/320147.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/320147.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2010/05/05/320147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/320147.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/320147.html</trackback:ping><description><![CDATA[<p>今天在开发Flex的应用时，发现一个Flex4的bug，即Context Menu中菜单项Label不能带settings字样。<br />
<br />
代码如下：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;addSettingItem:ContextMenuItem&nbsp;=&nbsp;new&nbsp;ContextMenuItem("Add&nbsp;Control&nbsp;Setting",&nbsp;true);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;saveSettingItem:ContextMenuItem&nbsp;=&nbsp;new&nbsp;ContextMenuItem("Save&nbsp;Control&nbsp;Setting",&nbsp;true);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;saveAll:ContextMenuItem&nbsp;=&nbsp;new&nbsp;ContextMenuItem("Save&nbsp;All&nbsp;Control&nbsp;Settings",&nbsp;true);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addSettingItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,&nbsp;contextMenuItem_addSettingItemSelect);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saveAll.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,&nbsp;contextMenuItem_saveAllSettingItemSelect);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saveSettingItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,&nbsp;contextMenuItem_saveSettingItemSelect);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rightClickContextMenu.hideBuiltInItems();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rightClickContextMenu.customItems&nbsp;=&nbsp;[addSettingItem,&nbsp;saveSettingItem,&nbsp;saveAll];</span></div>
<br />
结果无论怎样，&#8220;Save All Control Settings&#8221;菜单项就是出不来，改为&#8220;Save All Control Setting&#8221;就可以了。真是灰常灰常的奇怪&#8230;&#8230;<br />
<br />
猜想一下，是不是因为Flash右键菜单中本来就包含有一项&#8220;Settings...&#8221;的原因？
<img src ="http://www.blogjava.net/fastzch/aggbug/320147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Java World</a> 2010-05-05 20:35 <a href="http://www.blogjava.net/fastzch/archive/2010/05/05/320147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BlazeDS自定义认证与权限控制</title><link>http://www.blogjava.net/fastzch/archive/2010/04/28/319555.html</link><dc:creator>Robin's Java World</dc:creator><author>Robin's Java World</author><pubDate>Wed, 28 Apr 2010 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2010/04/28/319555.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/319555.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2010/04/28/319555.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/319555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/319555.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在昨天的文章《BlazeDS结合Tomcat进行权限控制》中，讲述了BlazeDS如何在Tomcat环境下进行权限控制，但是我们不难发现有很多缺点，甚至有一些都是致命的，比如不能跨平台（中间件），甚至不能跨版本，还有用户名角色等配置不能自定义配置在RDBMS，文件或其它地方等。所以今天我要分享给大家如何摆脱这些限制，避免这些不利因素。所幸的是，BlazeDS的设计者们已经为我们想到了这些，...&nbsp;&nbsp;<a href='http://www.blogjava.net/fastzch/archive/2010/04/28/319555.html'>阅读全文</a><img src ="http://www.blogjava.net/fastzch/aggbug/319555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Java World</a> 2010-04-28 09:56 <a href="http://www.blogjava.net/fastzch/archive/2010/04/28/319555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BlazeDS结合Tomcat进行权限控制</title><link>http://www.blogjava.net/fastzch/archive/2010/04/27/319428.html</link><dc:creator>Robin's Java World</dc:creator><author>Robin's Java World</author><pubDate>Tue, 27 Apr 2010 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2010/04/27/319428.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/319428.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2010/04/27/319428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/319428.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/319428.html</trackback:ping><description><![CDATA[<br />
环境：<br />
BlazeDS 3.2.0.3978<br />
Tomcat 6.0.29 (本例在Tomcat 5.5中不能正常运行，因为Tomcat 5.5的context部分的设计与6.0不一样)<br />
Java5 <br />
<br />
1，在service-config.xml中加入认证和角色（组）的定义：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">security</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">login-command&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="flex.messaging.security.TomcatLoginCommand"</span><span style="color: #ff0000">&nbsp;server</span><span style="color: #0000ff">="Tomcat"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">security-constraint&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="trusted"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">auth-method</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Basic</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">auth-method</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">roles</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">role</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">tomcat</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">role</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">roles</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">security-constraint</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">security-constraint&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="users"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">auth-method</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Basic</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">auth-method</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">roles</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">role</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">role1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">role</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&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">role</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">tomcat</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">role</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">roles</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">security-constraint</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">security</span><span style="color: #0000ff">&gt;</span></div>
需要说明的是，这里的security-constraint tag相当于一个角色组，其id属性就是角色组的ID，如users角色组包含role1和tomcat两个角色。<br />
auth-method tag表示认证的方式，Basic即采用HTTP Basic认证方式，也可以自己实现认证方式，可调定为Custom，关于此种认证方式，我将在稍后分享给大家。<br />
<br />
这些角色和用户，均被定义在Tomcat的conf/tomcat-users.xml配置中：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version='1.0'&nbsp;encoding='utf-8'</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tomcat-users</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;NOTE:&nbsp;&nbsp;By&nbsp;default,&nbsp;no&nbsp;user&nbsp;is&nbsp;included&nbsp;in&nbsp;the&nbsp;"manager"&nbsp;role&nbsp;required<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;to&nbsp;operate&nbsp;the&nbsp;"/manager"&nbsp;web&nbsp;application.&nbsp;&nbsp;If&nbsp;you&nbsp;wish&nbsp;to&nbsp;use&nbsp;this&nbsp;app,<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;you&nbsp;must&nbsp;define&nbsp;such&nbsp;a&nbsp;user&nbsp;-&nbsp;the&nbsp;username&nbsp;and&nbsp;password&nbsp;are&nbsp;arbitrary.<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;NOTE:&nbsp;&nbsp;The&nbsp;sample&nbsp;user&nbsp;and&nbsp;role&nbsp;entries&nbsp;below&nbsp;are&nbsp;wrapped&nbsp;in&nbsp;a&nbsp;comment<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;and&nbsp;thus&nbsp;are&nbsp;ignored&nbsp;when&nbsp;reading&nbsp;this&nbsp;file.&nbsp;Do&nbsp;not&nbsp;forget&nbsp;to&nbsp;remove<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&lt;!..&nbsp;..&gt;&nbsp;that&nbsp;surrounds&nbsp;them.<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">role&nbsp;</span><span style="color: #ff0000">rolename</span><span style="color: #0000ff">="tomcat"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">role&nbsp;</span><span style="color: #ff0000">rolename</span><span style="color: #0000ff">="role1"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">role&nbsp;</span><span style="color: #ff0000">rolename</span><span style="color: #0000ff">="manager"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">user&nbsp;</span><span style="color: #ff0000">username</span><span style="color: #0000ff">="admin"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="admin"</span><span style="color: #ff0000">&nbsp;roles</span><span style="color: #0000ff">="manager"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">user&nbsp;</span><span style="color: #ff0000">username</span><span style="color: #0000ff">="tomcat"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="tomcat"</span><span style="color: #ff0000">&nbsp;roles</span><span style="color: #0000ff">="tomcat"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">user&nbsp;</span><span style="color: #ff0000">username</span><span style="color: #0000ff">="both"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="tomcat"</span><span style="color: #ff0000">&nbsp;roles</span><span style="color: #0000ff">="tomcat,role1"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">user&nbsp;</span><span style="color: #ff0000">username</span><span style="color: #0000ff">="role1"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="tomcat"</span><span style="color: #ff0000">&nbsp;roles</span><span style="color: #0000ff">="role1"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tomcat-users</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
2，在remote-config.xml中配置具体的destination的权限约束：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">destination&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="Domain"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">properties</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">source</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.robin.service.domain.DomainService</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">source</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">include-methods</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">method&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="getAllDomains"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">method&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="addOrUpdateDomain"</span><span style="color: #ff0000">&nbsp;security-constraint</span><span style="color: #0000ff">="trusted"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">include-methods</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">properties</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">security</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">security-constraint&nbsp;</span><span style="color: #ff0000">ref</span><span style="color: #0000ff">="users"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">security</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">destination</span><span style="color: #0000ff">&gt;</span></div>
在此配置中，定义所有的方法只要是users角色组中的用户即可访问，但是addOrUpdateDomain方法需要trusted角色组中的用户才能访问。<br />
<br />
3，将BlazeDS与Tomcat结合所依赖的lib复制到lib目录中，包含flex-tomcat-common.jar和flex-tomcat-server.jar两个JAR。<br />
<br />
4，修改Tomcat目录下的conf/context.xml文件，加入如下Context（在Tomcat5.5中无法成功）：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">Valve&nbsp;</span><span style="color: #ff0000">className</span><span style="color: #0000ff">="flex.messaging.security.TomcatValve"</span><span style="color: #0000ff">/&gt;</span></div>
<br />
好了，就这么简单，重启Tomcat，即可验证了。<br />
<br />
总结一下：<br />
1，引入了角色组的概念，这个比较好。<br />
2，角色和用户定义依赖于Tomcat，无法定义在如DBMS中，不方便修改。<br />
3，跨平台性不好。<br />
4，资源与权限的映射关系在开发时已经绑定死，无法动态修改。 <br />
<br />
<br />
PS：2010.4.28. 分享给大家不依赖Tomcat容器实现认证与授权的例子，如有需要，请参考：《<a id="viewpost1_TitleUrl" class="postTitle2" href="http://www.blogjava.net/fastzch/archive/2010/04/28/319555.html">BlazeDS自定义认证与权限控制</a>》<br />
<br />
<font color="#ff0000">本Blog所有内容不得随意转载，版权属于作者所有。如需转载请与作者联系（</font> <a href="mailto:fastzch@163.com"><font style="background-color: #ffffff" color="#ff0000">fastzch@163.com</font> </a><font style="background-color: #ffffff" color="#ff0000">&nbsp;&nbsp; QQ：9184314）。<br />
未经许可的转载，本人保留一切法律权益。<br />
一直以来，发现有某些人完全不尊重我的劳动成果，随意转载，提醒一下那些人小心哪天惹上官司。</font><br />
<img src ="http://www.blogjava.net/fastzch/aggbug/319428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Java World</a> 2010-04-27 09:56 <a href="http://www.blogjava.net/fastzch/archive/2010/04/27/319428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BlazeDS Study Notes -- Channel &amp; Endpoint</title><link>http://www.blogjava.net/fastzch/archive/2010/04/07/317619.html</link><dc:creator>Robin's Java World</dc:creator><author>Robin's Java World</author><pubDate>Wed, 07 Apr 2010 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2010/04/07/317619.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/317619.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2010/04/07/317619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/317619.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/317619.html</trackback:ping><description><![CDATA[<p>The following example shows a RemoteObject component that defines a channel set and channel inline in MXML:<br />
...<br />
&lt;RemoteObject id="ro" destination="Dest"&gt;<br />
&lt;mx:channelSet&gt;<br />
&lt;mx:ChannelSet&gt;<br />
&lt;mx:channels&gt;<br />
&lt;mx:AMFChannel id="myAmf"<br />
uri="http://myserver:2000/myapp/messagebroker/amf"/&gt;<br />
&lt;/mx:channels&gt;<br />
&lt;/mx:ChannelSet&gt;<br />
&lt;/mx:channelSet&gt;<br />
&lt;/RemoteObject&gt;</p>
<p><br />
The following example shows ActionScript code that is equivalent to the MXML code in the previous example:<br />
private function run():void {<br />
&nbsp;ro = new RemoteObject();<br />
&nbsp;var cs:ChannelSet = new ChannelSet(); <br />
&nbsp;cs.addChannel(new AMFChannel("myAmf", <br />
&nbsp;"http://servname:2000/eqa/messagebroker/amf"));<br />
&nbsp;ro.destination = "Dest"; <br />
&nbsp;ro.channelSet = cs;<br />
}</p>
<p>Important: When you create a channel on the client, you must still include a channel definition that specifies an endpoint class in the services-config.xml file. Otherwise, the message broker cannot pass a Flex client request to an endpoint.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Assigning channels and endpoints to a destination<br />
1,If most of the destinations across all services use the same channels, you can define application-level default channels in the services-config.xml file, as the following example shows.<br />
Note: Using application-level default channels is a best practice whenever possible. <br />
&lt;services-config ...&gt;<br />
...<br />
&lt;default-channels&gt;<br />
&lt;channel ref="my-http"/&gt;<br />
&lt;channel ref="my-amf"/&gt;<br />
&lt;/default-channels&gt;<br />
...<br />
In this case, all destinations that do not define channels use a default channel. Destinations can override the <br />
default channel setting by specifying their own channels, and services can also override it by specifying their own <br />
default channels.<br />
2,If most of the destinations in a service use the same channels, you can define service-level default channels, as <br />
the following example shows:<br />
&lt;service ...&gt;<br />
...<br />
&lt;default-channels&gt;<br />
&lt;channel ref="my-http"/&gt;<br />
&lt;channel ref="my-amf"/&gt;<br />
&lt;/default-channels&gt;<br />
...<br />
In this case, all destinations in the service that do not explicitly specify their own channels use the default <br />
channel. <br />
3,The destination definition can reference a channel inline, as the following example shows:<br />
&lt;destination id="sampleVerbose"&gt;<br />
&lt;channels&gt;<br />
&lt;channel ref="my-secure-amf"/&gt;<br />
&lt;/channels&gt;<br />
...<br />
&lt;/destination&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>How to choosing a channel?<br />
1, Non-polling AMF and HTTP channels<br />
You can use AMF and HTTP channels without polling for remote procedure call (RPC) services, such as remoting service calls, proxied HTTP service calls and web service requests. These scenarios do not require the client to poll for messages or the server to push messages to the client.<br />
2, Piggybacking on AMF and HTTP channels<br />
The piggybacking feature enables the transport of queued messages along with responses to any messages the client sends to the server over the channel. Piggybacking provides lightweight pseudo polling, where rather than the client channel polling the server on a fixed or adaptive interval, when the client sends a non-command message to the server (using a Producer or RemoteObject object), the server sends any pending data for client messaging or data management subscriptions along with the response to the client message. <br />
Piggybacking can also be used on a channel that has polling enabled but on a wide interval like 5 seconds or 10 seconds or more, in which case the application appears more responsive if the client is sending messages to the server. In this mode, the client sends a poll request along with any messages it sends to the server between its regularly scheduled poll requests. The channel piggybacks a poll request along with the message being sent, and the server piggybacks any pending messages for the client along with the acknowledge response to the client message.<br />
3, Polling AMF and HTTP channels<br />
AMF and HTTP channels support simple polling mechanisms that clients can use to request messages from the server at set intervals. A polling AMF or HTTP channel is useful when other options such as long polling or streaming channels are not acceptable and also as a fallback channel when a first choice, such as a streaming channel, is unavailable at run time. <br />
4, Long polling AMF and HTTP channels<br />
You can use AMF and HTTP channels in long polling mode to get pushed messages to the client when the other more efficient and real-time mechanisms are not suitable. This mechanism uses the normal application server HTTP request processing logic and works with typical J2EE deployment architectures. <br />
You can establish long polling for any channel that uses a non-streaming AMF or HTTP endpoint by setting the polling-enabled ,&nbsp; polling-interval-millis ,&nbsp; wait-interval-millis , and&nbsp; client-wait-interval-<br />
millis&nbsp; properties in a channel definition.<br />
5, Streaming channels<br />
For streaming, you can use streaming AMF or HTTP channels. Streaming AMF and HTTP channels work with streaming AMF or HTTP endpoints.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
Long polling AMF and HTTP channels<br />
In the default configuration for a polling AMF or HTTP channel, the endpoint does not wait for messages on the server. When the poll request is received, it checks whether any messages are queued for the polling client and if so, those messages are delivered in the response to the HTTP request. You configure long polling in the same way as polling, but you also must set the&nbsp; wait-interval-millis ,&nbsp; max-waiting-poll-requests , and client-wait-interval-millis&nbsp; properties. <br />
在一个polling AMF或HTTP channel默认配置下，服务端endpoint不会等待消息，当轮询请求被收到时，它检查任何消息是否排队等待轮询的客户端，如果是，这些消息被交付给HTTP请求的响应。<br />
To achieve long polling, you set the following properties in the&nbsp; properties&nbsp; section of a channel definition in the services-config.xml file:<br />
polling-enabled<br />
polling-interval-millis<br />
wait-interval-millis&nbsp; <br />
max-waiting-poll-requests .<br />
client-wait-interval-millis</p>
<p><br />
下面分别讲一下前面提到的几种模式：<br />
1)无轮询AMF、HTTP通道<br />
你可以使用这些通道无轮询的方式来提供RPC 服务，比如远程服务调用、代理HTTP服务调用以及Web service请求。这些方案不要求客户端轮询信息或者服务端将消息&#8220;推&#8221;给客户端。<br />
&lt;!-- Simple AMF --&gt;<br />
&lt;channel-definition id="samples-amf"<br />
&nbsp;type="mx.messaging.channels.AMFChannel"&gt;<br />
&lt;endpoint url="http://{server.name}:8400/myapp/messagebroker/amf"<br />
&nbsp;type="flex.messaging.endpoints.AmfEndpoint"/&gt;<br />
&lt;/channel-definition&gt;</p>
<p>&lt;!-- Simple secure AMF --&gt;<br />
&lt;channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel"&gt;<br />
&nbsp;&lt;endpoint url="https://{server.name}:9100/dev/messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/&gt;<br />
&lt;/channel-definition&gt;</p>
<p>&lt;!-- Simple HTTP --&gt;<br />
&lt;channel-definition id="my-http"<br />
class="mx.messaging.channels.HTTPChannel"&gt;<br />
&nbsp;&lt;endpoint url="http://{server.name}:8400/dev/messagebroker/http" class="flex.messaging.endpoints.HTTPEndpoint"/&gt;<br />
&lt;/channel-definition&gt;</p>
<p>&lt;!-- Simple secure HTTP --&gt;<br />
&lt;channel-definition id="my-secure-http" class="mx.messaging.channels.SecureHTTPChannel"&gt;<br />
&nbsp;&lt;endpoint url="https://{server.name}:9100/dev/messagebroker/httpsecure" class="flex.messaging.endpoints.SecureHTTPEndpoint"/&gt;<br />
&lt;/channel-definition&gt;</p>
<p><br />
2)搭载式AMF、HTTP通道<br />
搭载式确保独立于客户端发送信息到服务端或者服务端响应消息到客户端的数据传输。搭载式提供了轻量级的假轮询：一种比固定或者适当时间间隔轮询服务端更好的方式，s特别是当客户端发送一个非命令消息到服务器（使用一个生产者或RemoteObject对象）时，服务器发送任何未确定的数据到客户端或数据管理订阅随着客户端的信息响应。<br />
也可以在一个需要确保轮询，但是间隔却比较长，例如5秒或者10秒甚至更多的通道中使用，在这种情况下，应用程序似乎更加敏感。这种模式下，客户端的轮询请求独立于任何其他消息发送给服务端</p>
<p>3)轮询AMF、HTTP通道<br />
AMF、HTTP通道提供了简单的轮询机制，客户端可以用这个机制定期发送请求消息到服务端。当长期轮询或者流通道不能使用时，或者作为一个流通道的备用通道时候，轮询AMF、HTTP通道是适用的。<br />
&lt;!-- AMF with polling --&gt;<br />
&lt;channel-definition id="samples-polling-amf" type="mx.messaging.channels.AMFChannel"&gt;<br />
&nbsp;&lt;endpoint url="http://{server.name}:8700/dev/messagebroker/amfpolling" &nbsp;&nbsp;type="flex.messaging.endpoints.AMFEndpoint"/&gt;<br />
&nbsp;&lt;properties&gt;<br />
&nbsp;&nbsp;&lt;polling-enabled&gt;true&lt;/polling-enabled&gt;<br />
&nbsp;&nbsp;&lt;polling-interval-seconds&gt;8&lt;/polling-interval-seconds&gt;<br />
&nbsp;&lt;/properties&gt;<br />
&lt;/channel-definition&gt;</p>
<p>&lt;!-- HTTP with polling --&gt;<br />
&lt;channel-definition id="samples-polling-http" type="mx.messaging.channels.HTTPChannel"&gt;<br />
&lt;endpoint url="http://{server.name}:8700/dev/messagebroker/httppolling"<br />
&nbsp;type="flex.messaging.endpoints.HTTPEndpoint"/&gt;<br />
&nbsp; &lt;properties&gt;<br />
&nbsp;&lt;polling-enabled&gt;true&lt;/polling-enabled&gt;<br />
&nbsp;&lt;polling-interval-seconds&gt;8&lt;/polling-interval-seconds&gt;<br />
&nbsp; &lt;/properties&gt;<br />
&lt;/channel-definition&gt;<br />
&nbsp;注意：这种模式中你也可以使用secure通道。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>4)&nbsp; 长轮询AMF、HTTP通道<br />
当其他更加有效率的实时机制不合适的时候，你可以使用AMF和HTTP通道的长期轮询模式来&#8220;推&#8221;消息到客户端。 This mechanism uses the normal application server HTTP request processing logic and works with typical J2EE deployment architectures.这一机制的使用标准应用服务器的HTTP请求处理逻辑，并与典型的J2EE架构协同工作。<br />
You can establish long polling for any channel that uses a non-streaming AMF or HTTP endpoint by setting the polling-enabled , polling-interval-millis , wait-interval-millis , and client-wait-interval-millis properties in a channel definition; for more information, see Simple channels and endpoints .您可以为任何通道建立长期轮询来使用相应端点，需要设置一下参数：polling-enabled、polling-interval-millis、wait-interval-millis、client-w ait-interval-mills。有关wait-interval-millis的更多内容请参考Blazeds文档。<br />
&lt;!-- Long polling AMF --&gt;<br />
&lt;channel-definition id="my-amf-longpoll" class="mx.messaging.channels.AMFChannel"&gt;<br />
&lt;endpoint url="http://servername:8700/contextroot/messagebroker/myamflongpoll"<br />
&nbsp;class="flex.messaging.endpoints.AMFEndpoint"/&gt;<br />
&nbsp; &lt;properties&gt;<br />
&nbsp;&lt;polling-enabled&gt;true&lt;/polling-enabled&gt;<br />
&nbsp;&lt;polling-interval-seconds&gt;0&lt;/polling-interval-seconds&gt;<br />
&nbsp;&lt;wait-interval-millis&gt;60000&lt;/wait-interval-millis&gt;<br />
&nbsp;&lt;client-wait-interval-millis&gt;3000&lt;/client-wait-interval-millis&gt;<br />
&nbsp;&lt;max-waiting-poll-requests&gt;100&lt;/max-waiting-poll-requests&gt;<br />
&nbsp; &lt;/properties&gt;<br />
&lt;/channel-definition&gt;</p>
<p>&nbsp;</p>
<p>关于 Non-polling,Polling,Long polling和steaming的一些解释<br />
http://www.qgy18.com/2008/08/webim-design-transport/<br />
http://newteevee.com/2009/10/04/adobe-to-finally-support-http-streaming/</p>
<p>1.短轮询(polling)：核心思想是客户端定时去服务器取消息。为了实现即时效果，轮询的间隔必须设计得足够短，另外为了操作的流畅，需要使用Ajax来发送请求。本人的QGYWebIM就是采用的此方案。这种方案的优点是：后端程序编写比较容易，发送完响应信息马上断开连接，不会占用太多服务器资源。缺点是一般情况下，频繁的请求中有大半是无用，这些冗余请求无形中浪费了带宽和服务器资源。我们可以通过判断用户的活跃程度来决策请求服务器的间隔，我在51的一个帖子提到过这种方法，但是间隔一旦长了，消息的传送就有延时，违背了即时聊天的初衷了。</p>
<p>2.长轮询(long-polling)：基本原理是客户端向服务器发送请求，服务器接到请求后hold住连接，直到有新消息才返回响应信息并关闭连接，连接被断开期间用户的新信息会被服务器缓存起来。客户端处理完响应信息后再向服务器发送新的请求。这种做法的优势是如果用户一直没新消息，客户端不会频繁的轮询去服务器取消息，节省了流量，但是服务器维持长连接是很消耗资源的。具体实现起来，前端这边基本不需要什么改动，依然是用Ajax轮询取信息，后端需要在没有新消息时处理一下。</p>
<p>3.长连接(streaming)：其实很早以前就有人使用这种技术来实现聊天室的通讯，HTTP1.1开始支持。以前在页面中嵌入一个iframe，iframe里放一个使用长连接页面，服务器有新消息就会及时的在iframe里反映出来，再依靠客户端的脚本解析出来就OK了。这样做一个比较严重的问题是：使用 iframe请求长连接时，无论是IE还是firefox都会认为页面没有加载完而显示进度条，很难看。不过这个问题是可以解决的。firefox支持了Streaming Ajax，在readyState为3的时候就能接受数据，所以问题不大；IE则只能在readyState为4，即连接断开时才能得到返回值。但是伟大的Google工程师使用了一个hack成功的解决了这个问题：使用一个被称为&#8220;htmlfile&#8221;的ActiveX，把iframe放在这个ActiveX里就OK了。</p>
<p>无疑，使用长连接对于用户来说是最好的方案，用户体验最好（消息能及时的到达）、占用用户带宽最少（不会发送无用的请求），但是会增加服务器的开销；长轮询是折中方案，Facebook IM 就是采用这种方案，不过做了一点改动：客户端发起的每个连接服务器都hold10S，这10S中新消息会源源不断的返回给客户端，10s后连接关闭，客户端发起下一个连接。这样做是因为Facebook的用户会不断的打开、关闭新页面，如果每个页面都建立一个永久的长连接，会阻塞浏览器其他请求，服务器也会吃不消的；短轮询因为实现起来简单，适用于小型应用。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
There is a browser-specific limit to the number of connections allowed per session. In Firefox, the limit is eight connections per session. In Internet Explorer, the limit is two connections allowed per session. Therefore, BlazeDS must limit the number of streaming connections per session on the server to stay below this limit.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
Channel and endpoint recommendations</p>
<p>1. AMFChannel/Endpoint configured for long polling (no fallback needed)<br />
Benifits:<br />
Valid HTTP request/response pattern over standard ports that nothing in the network path will have trouble with.<br />
Disadvantages:<br />
When many messages are being pushed to the client, this configuration has the overhead of a poll round trip for every pushed message or small batch of messages queued between polls. Most applications are not pushing data so frequently for this to be a problem.<br />
The Servlet API uses blocking IO, so you must define an upper bound for the number of long poll requests parked on the server at any single instant. If your number of clients exceeds this limit, the excess clients devolve to simple polling on the default 3- second interval with no server wait. <br />
For example, if you server request handler thread pool has a size of 500, you could set the upper bound for waited polls to 250, 300, or 400 depending on the relative amount of non-poll requests you expect to service concurrently.</p>
<p>2. StreamingAMFChannel/Endpoint (in a channel set followed by the polling AMFChannel for fallback)<br />
Benifits:<br />
No polling overhead associated with pushing messages to the client.<br />
Uses standard HTTP ports so firewalls do not interfere and all requests/responses are HTTP so packet inspecting proxies won&#8217;t drop the packets.<br />
Disadvantages:<br />
Holding onto the open request on the server and writing an infinite response is not typical HTTP behavior. HTTP proxies that buffer responses before forwarding them can effectively consume the stream. Assign the channel&#8217;s &#8216;connect-timeout-seconds&#8217; property a value of 2 or 3 to detect this and trigger fallback to the next channel in your channel set.<br />
No support for HTTP 1.0 client. If the client is 1.0, the open request is faulted and the client falls back to the next channel in its channel set.<br />
The Servlet API uses blocking IO so as with long polling above, you must set a configured upper bound on the number of streaming connections you allow. Clients that exceed this limit are not able to open a streaming connection and will fall back to the next channel in their channel set.</p>
<p>3. AMFChannel/Endpoint with simple polling and piggybacking enabled (no fallback needed)<br />
Benifits:<br />
Valid HTTP request/response pattern over standard ports that nothing in the network path will have trouble with.<br />
User experience feels more real-time than with simple polling on an interval.<br />
Does not have thread resource constraints like long polling and streaming due to the blocking IO of the Servlet API.<br />
Disadvantages:<br />
Less real-time behavior than long polling or streaming. Requires client interaction with the <br />
server to receive pushed data faster than the channel's configured polling interval.</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/fastzch/aggbug/317619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Java World</a> 2010-04-07 10:27 <a href="http://www.blogjava.net/fastzch/archive/2010/04/07/317619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BlazeDS Study Notes -- Achitecture</title><link>http://www.blogjava.net/fastzch/archive/2010/04/03/317413.html</link><dc:creator>Robin's Java World</dc:creator><author>Robin's Java World</author><pubDate>Sat, 03 Apr 2010 14:31:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2010/04/03/317413.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/317413.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2010/04/03/317413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/317413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/317413.html</trackback:ping><description><![CDATA[<p>&nbsp;Channels and channel sets<br />
A Flex component uses a channel to communicate with a BlazeDS server. A channel set contains channels; its primary function is to provide connectivity between the Flex client and the BlazeDS server. A channel set contains channels ordered by preference. The Flex component tries to connect to the first channel in the channel set and in the case where a connection cannot be established falls back to the next channel in the list. The Flex component continues to go through the list of channels in the order in which they are specified until a connection can be established over one of the channels or the list of channels is exhausted.<br />
Flex clients can use different channel types such as the AMFChannel and HTTPChannel. Channel selection depends on a number of factors, including the type of application you are building. If non-binary data transfer is required, you would use the HTTPChannel, which uses a non-binary format called AMFX (AMF in XML).</p>
<p>Messages<br />
All messages have client-side (ActionScript) implementations and server-side (Java) implementations because the messages are serialized and deserialized on both the client and the server.</p>
<p>Endpoint<br />
&nbsp;It is important that the channel and the endpoint use the same message format. </p>
<p>MessageBroker<br />
The MessageBroker is responsible for routing messages to services and is at the core of BlazeDS on the server. After an endpoint initially processes the request, it extracts the message from the request and passes it to the MessageBroker. The MessageBroker inspects the message's destination and passes the message to its intended service. If the destination is protected by a security constraint, the MessageBroker runs the authentication and authorization checks before passing the message along</p>
<p>Services and destinations<br />
Services and destinations are the next links in the message processing chain in the BlazeDS server. The system includes four services and their corresponding destinationsBlazeDS: <br />
&#8226;&nbsp;&nbsp;&nbsp;&nbsp; RemotingService and RemotingDestination<br />
&#8226;&nbsp;&nbsp;&nbsp;&nbsp; HTPProxyService and HTTPProxyDestination<br />
&#8226;&nbsp;&nbsp;&nbsp;&nbsp; MessageService and MessageDestination<br />
Services are the targets of messages from client-side Flex components. Think of destinations as instances of a service configured in a certain way. For example, a RemoteObject component is used on the Flex client to communicate with the RemotingService. In the RemoteObject component, you must specify a destination&nbsp; id&nbsp; property that refers to a remoting destination with certain properties, such as the class you want to invoke methods on. The mapping between client-side Flex components and BlazeDS services is as follows: <br />
&#8226;&nbsp;&nbsp;&nbsp;&nbsp; HTTPService and WebService communicate with HTTPProxyService/HTTPProxyDestination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (RPC services)<br />
&#8226;&nbsp;&nbsp;&nbsp;&nbsp; RemoteObject communicates with RemotingService/RemotingDestination &nbsp;&nbsp;&nbsp;(RPC services)<br />
&#8226;&nbsp;&nbsp;&nbsp;&nbsp; Producer and Consumer communicate with MessageService/MessageDestination&nbsp;&nbsp;&nbsp;(Message services)</p>
<p><br />
Adapters and assemblers<br />
Although the BlazeDS server comes with a rich set of adapters and assemblers to communicate with different systems, custom adapters and assemblers can be plugged into the BlazeDS server. Similarly, you do not have to create all destinations in configuration files, but instead you can create them dynamically at server startup or when the server is running.</p>
<p><br />
Configuration tokens<br />
The configuration files sometimes contain special&nbsp; {server.name}&nbsp; and&nbsp; {server.port}&nbsp; tokens. These tokens are replaced with server name and port values based on the URL from which the SWF file is served when it is accessed through a web browser from a web server. Similarly, a special&nbsp; {context.root}&nbsp; token is replaced with the actual context root of a web application.<br />
Note: If you use server tokens in a configuration file for an Adobe AIR application and you compile using that file, the application will not be able to connect to the server. You can avoid this issue by configuring channels in ActionScript rather than in a configuration file.</p>
<p>How you define JVM options depends on the application server you use. For example, in Apache Tomcat, you can define an environment variable JAVA_OPTS that contains tokens and their values, as this code snippet shows:<br />
JAVA_OPTS=-Dmessaging.channel=my-amf -Dmy.token=myValue</p>
<p>&nbsp;</p>
 <img src ="http://www.blogjava.net/fastzch/aggbug/317413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Java World</a> 2010-04-03 22:31 <a href="http://www.blogjava.net/fastzch/archive/2010/04/03/317413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BlazeDS Study Notes -- Building Project</title><link>http://www.blogjava.net/fastzch/archive/2010/04/01/317237.html</link><dc:creator>Robin's Java World</dc:creator><author>Robin's Java World</author><pubDate>Thu, 01 Apr 2010 14:31:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2010/04/01/317237.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/317237.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2010/04/01/317237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/317237.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/317237.html</trackback:ping><description><![CDATA[<p>Build client-side application notes:<br />
1, Specifying the services-config.xml file in a compilation<br />
When you compile your Flex application, you typically specify the services-config.xml configuration file to the compiler. This file defines the channel URLs that the client-side Flex application uses to communicate with the BlazeDS server. Then the channel URLs are compiled into the resultant SWF file.<br />
Both client-side and server-side code use the services-config.xml configuration file. If you change anything in services-config.xml, you usually have to recompile your client-side applications and restart your server-side application for the changes to take effect.<br />
In Flex Builder, the appropriate services-config.xml file is included automatically based on the BlazeDS web application that you specified in the configuration of your Flex Builder project. When you use the mxmlc compiler, use the&nbsp; services&nbsp; option to specify the location of the file. <br />
Note: You can also create channel definitions at run time in ActionScript. In that case, you might be able to omit the reference to the services-config.xml configuration file from the compiler. <br />
2, Specifying the context root in a compilation<br />
The services-config.xml configuration file typically uses the&nbsp; context.root&nbsp; token to specify the context root of a <br />
web application. At compile time, you use the compiler&nbsp; context-root&nbsp; option to specify that information. <br />
During a compilation, Flex Builder automatically sets the value of the&nbsp; context.root&nbsp; token based on the BlazeDS <br />
web application that you specified in the configuration of your project. When you use the mxmlc compiler, use the <br />
context-root&nbsp; option to set it. </p>
<p>&nbsp;<br />
How to create a Flash Builder project?<br />
Use this procedure to create a Flex Builder project to edit one of the samples shipped with the Test Drive application. <br />
The procedure for creating and configuring a new project is almost the same as the following procedure. <br />
1&nbsp;&nbsp;&nbsp;&nbsp; Start Flex Builder.<br />
2&nbsp;&nbsp;&nbsp;&nbsp; Select File &gt; New &gt; Flex Project.<br />
3&nbsp;&nbsp;&nbsp;&nbsp; Enter a project name. You are editing an existing application, so use the exact name of the sample folder: <br />
testdrive-chat.<br />
Note: If you are creating an empty project, you can name it anything that you want. <br />
4&nbsp;&nbsp;&nbsp;&nbsp; If you unzipped flex-src.zip in the samples directory, deselect the Use Default Location option, and specify the directory as C:\blazeds\tomcat\webapps\samples\testdrive-chat, or wherever you unzipped the file on your computer.<br />
Note: By default, Flex Builder creates the project directory based on the project name and operating system. For example, if you are using the plug-in configuration of Flex Builder on Microsoft Windows, the default project directory is C:\Documents and Settings\USER_NAME\workspace\PROJECT_NAME.<br />
5&nbsp;&nbsp;&nbsp;&nbsp; Select the application type as Web application (runs in Flash Player) to configure the application to run in the browser as a Flash Player pplication.<br />
If you are creating an AIR application, select Desktop Application (Runs In Adobe AIR). However, make sure that you do not have any server tokens in URLs in the configuration files. In the web application that ships with BlazeDS, server tokens are used in the channel endpoint URLs in the WEB-INF/flex/services-config.xml file, as the following example shows:<br />
&lt;endpoint <br />
url="https://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="flex.messaging.endpoints.StreamingAMFEndpoint"/&gt;<br />
You would change that line to the following:<br />
&lt;endpoint url="http://your_server_name:8400/samples/messagebroker/streamingamf"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="flex.messaging.endpoints.StreamingAMFEndpoint"/&gt;<br />
6&nbsp;&nbsp;&nbsp;&nbsp; Select J2EE as the Application server type.<br />
7&nbsp;&nbsp;&nbsp;&nbsp; Select Use Remote Object Access.<br />
8&nbsp;&nbsp;&nbsp;&nbsp; Select LiveCycle Data Services.<br />
9&nbsp;&nbsp;&nbsp;&nbsp; If the option is available, deselect Create Combined Java/Flex Project With WTP.<br />
10&nbsp; Click Next.<br />
11&nbsp; Deselect Use Default Location For Local LiveCycle Data Services Server. <br />
12&nbsp; Set the root folder, root URL, and context root of your web application. <br />
The root folder specifies the top-level directory of the web application (the directory that contains the WEB-INF directory). The root URL specifies the URL of the web application, and the context root specifies the root of the web application.<br />
13&nbsp; Make sure that your BlazeDS server is running, and click Validate Configuration to ensure that your project is valid.<br />
14&nbsp; Verify that the Compile The Application Locally In Flex Builder option is selected.<br />
15&nbsp; Clear the Output Folder field to set the directory of the compiled SWF file to the main project directory. <br />
By default, Flex Builder writes the compiled SWF file to the bin-debug directory under the main project directory. To use a different output directory, specify it in the Output Folder field. <br />
16&nbsp; Click Next.<br />
17&nbsp; Set the name of the main application file to Chat.mxml, and click Finish.</p>
<p>&nbsp;</p>
<p>&nbsp;Client-side logging<br />
For client-side logging, you directly write messages to the log file, or configure the application to write messages generated by Flex to the log file. Flash Debug Player has two primary methods of writing messages to a log file:<br />
?&nbsp;&nbsp;&nbsp;&nbsp; The global&nbsp; trace()&nbsp; method. The global trace() method prints a String to the log file. Messages can contain checkpoint information to signal that your application reached a specific line of code, or the value of a variable. <br />
?&nbsp;&nbsp;&nbsp;&nbsp; Logging API. The logging API, implemented by the TraceTarget class, provides a layer of functionality on top of the&nbsp; trace()&nbsp; method. For example, you can use the logging API to log debug, error, and warning messages generated by Flex while applications execute.<br />
Flash Debug Player sends logging information to the flashlog.txt file. The operating system determines the location of this file, as the following table shows:<br />
Use settings in the mm.cfg text file to configure Flash Debug Player for logging. If this file does not exist, you can create it when you first configure Flash Debug Player. The location of this file depends on your operating system. <br />
The following table shows where to create the mm.cfg file for several operating systems: <br />
The mm.cfg file contains many settings that you can use to control logging. The following sample mm.cfg file enables error reporting and trace logging:<br />
ErrorReportingEnable=1<br />
TraceOutputFileEnable=1<br />
After you enable reporting and logging, call the&nbsp; trace()&nbsp; method to write a String to the flashlog.txt file, as the <br />
following example shows:<br />
trace("Got to checkpoint 1.");<br />
Insert the following MXML line to enable the logging of all Flex-generated debug messages to flashlog.txt:<br />
&lt;mx:TraceTarget loglevel="2"/&gt;</p>
<p>Server-side logging<br />
You configure server-side logging in the logging section of the services configuration file, services-config.xml. By default, output is sent to System.out. <br />
You set the logging level to one of the following available levels:<br />
?&nbsp;&nbsp;&nbsp;&nbsp; All<br />
?&nbsp;&nbsp;&nbsp;&nbsp; Debug<br />
?&nbsp;&nbsp;&nbsp;&nbsp; Info<br />
?&nbsp;&nbsp;&nbsp;&nbsp; Warn<br />
?&nbsp;&nbsp;&nbsp;&nbsp; Error<br />
?&nbsp;&nbsp;&nbsp;&nbsp; None<br />
You typically set the server-side logging level to&nbsp; Debug&nbsp; to log all debug messages, and also all info, warning, and error messages. The following example shows a logging configuration that uses the&nbsp; Debug&nbsp; logging level:<br />
&lt;logging&gt;<br />
&lt;!-- You may also use flex.messaging.log.ServletLogTarget. --&gt;<br />
&lt;target class="flex.messaging.log.ConsoleTarget" level="Debug"&gt;<br />
&lt;properties&gt;<br />
&lt;prefix&gt;[Flex]&lt;/prefix&gt;<br />
&lt;includeDate&gt;false&lt;/includeDate&gt;<br />
&lt;includeTime&gt;false&lt;/includeTime&gt;<br />
&lt;includeLevel&gt;false&lt;/includeLevel&gt;<br />
&lt;includeCategory&gt;false&lt;/includeCategory&gt;<br />
&lt;/properties&gt;<br />
&lt;filters&gt;<br />
&lt;pattern&gt;Endpoint&lt;/pattern&gt;<br />
&lt;!--&lt;pattern&gt;Service.*&lt;/pattern&gt;--&gt;<br />
&lt;!--&lt;pattern&gt;Message.*&lt;/pattern&gt;--&gt;<br />
&lt;/filters&gt;<br />
&lt;/target&gt;<br />
&lt;/logging&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>You use two parameters in a channel definition to enable message processing metrics:<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;record-message-times&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;record-message-sizes&gt;&nbsp; <br />
Set these parameters to&nbsp; true&nbsp; or&nbsp; false ; the default value is&nbsp; false . You can set the parameters to different values to capture only one type of metric. For example, the following channel definition specifies to capture message timing <br />
information, but not message sizing information:<br />
&lt;channel-definition id="my-streaming-amf" <br />
class="mx.messaging.channels.StreamingAMFChannel"&gt;<br />
&lt;endpoint <br />
url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf" <br />
class="flex.messaging.endpoints.StreamingAMFEndpoint"/&gt;<br />
&nbsp;&lt;properties&gt;<br />
&nbsp;&nbsp;&lt;record-message-times&gt;true&lt;/record-message-times&gt;<br />
&nbsp;&nbsp;&lt;record-message-sizes&gt;false&lt;/record-message-sizes&gt;<br />
&nbsp;&lt;/properties&gt;<br />
&lt;/channel-definition&gt;<br />
</p>
<img src ="http://www.blogjava.net/fastzch/aggbug/317237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Java World</a> 2010-04-01 22:31 <a href="http://www.blogjava.net/fastzch/archive/2010/04/01/317237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BlazeDS Study Notes -- Overview &amp; Concepts</title><link>http://www.blogjava.net/fastzch/archive/2010/03/31/317033.html</link><dc:creator>Robin's Java World</dc:creator><author>Robin's Java World</author><pubDate>Wed, 31 Mar 2010 04:19:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2010/03/31/317033.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/317033.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2010/03/31/317033.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/317033.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/317033.html</trackback:ping><description><![CDATA[<p>Flex and AIR applications use Flex components to communicate with the BlazeDS server, including the RemoteObject, HTTPService, WebService, Producer, and Consumer components. The HTTPService, WebService, Producer, and Consumer components are part of the Flex Software Development Kit (SDK). </p>
<p>What's Producer?</p>
<p>The BlazeDS core features include the RPC services and the Messaging Service. <br />
You can access data through client-side RPC components that include HTTP GET or POST (HTTP services), SOAP (web services), or Java objects (remote object services). <br />
BlazeDS lets you use RemoteObject components to access remote Java objects without configuring them as SOAP-compliant web services.</p>
<p>Client applications that send messages are called message producers. You define a producer in a Flex application by using the Producer component. Client applications that receive messages are called message consumers. You define a consumer in a Flex application by using the Consumer component. A Consumer component subscribes to a server-side destination and receives messages that a Producer component sends to that destination. For more information on messaging, see Using the Messaging Service. </p>
<p><br />
BlazeDS uses a message-based framework to send data back and forth between the client and server. BlazeDS uses two primary exchange patterns between server and client. In the first pattern, the request-response pattern, the second pattern is the publish-subscribe pattern where the server routes published messages to the set of clients that have subscribed to receive them.</p>
<p>&nbsp;</p>
<p>To send messages across the network, the client uses channels. A channel encapsulates message formats, network protocols, and network behaviors to decouple them from services, destinations, and application code. A channel formats and translates messages into a network-specific form and delivers them to an endpoint on the server.&nbsp; </p>
<p>&nbsp;</p>
<p><br />
Channels communicate with Java-based endpoints on the server. An endpoint unmarshals messages in a protocol-specific manner and then passes the messages in generic Java form to the message broker. The message broker determines where to send messages, and routes them to the appropriate service destination. <br />
BlazeDS includes several types of channels, including standard and secure Action Message Format (AMF) channels and HTTP (AMFX) channels. AMF and HTTP channels support non-polling request-response patterns and client polling patterns to simulate real-time messaging. The streaming AMF and HTTP channels provide true data streaming for real-time messaging.&nbsp; </p>
<p>&nbsp;</p>
<p>&nbsp;Configure an existing J2EE web application to support BlazeDS by performing the following steps:&nbsp;<br />
&nbsp;1, Add the BlazeDS JAR files and dependent JAR files to the WEB-INF/lib directory.&nbsp; <br />
2, Edit the BlazeDS configuration files in the WEB-INF/flex directory.&nbsp; <br />
3, Define MessageBrokerServlet and a session listener in WEB-INF/web.xml. <br />
</p>
<img src ="http://www.blogjava.net/fastzch/aggbug/317033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Java World</a> 2010-03-31 12:19 <a href="http://www.blogjava.net/fastzch/archive/2010/03/31/317033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flash Performance Issue in None-activeX Architecture -- stutter sound</title><link>http://www.blogjava.net/fastzch/archive/2010/03/05/314592.html</link><dc:creator>Robin's Java World</dc:creator><author>Robin's Java World</author><pubDate>Fri, 05 Mar 2010 04:15:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2010/03/05/314592.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/314592.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2010/03/05/314592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/314592.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/314592.html</trackback:ping><description><![CDATA[Recently, I had spent a lot of time on sound playback of Flash Player 10, but I can't slove a performance issue in none-ActiveX architecture. I will get stutter/machine gun sound when I load a heavy load web page at the same time in Firefox/Chrome/Safari. this case don't happen in IE, and I&nbsp;always&nbsp;get smooth sound.<br />
<br />
The root cause of this issue is used to extract method of Sound class for retract samples, and then play by extracted samples. You may ask me, why don't use play method of Sound class directly? I think I only answer you that it's business requirements.<br />
<br />
Following are my test code:<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img id="Codehighlighter1_8_1519_Open_Image" onclick="this.style.display='none'; Codehighlighter1_8_1519_Open_Text.style.display='none'; Codehighlighter1_8_1519_Closed_Image.style.display='inline'; Codehighlighter1_8_1519_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_8_1519_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_8_1519_Closed_Text.style.display='none'; Codehighlighter1_8_1519_Open_Image.style.display='inline'; Codehighlighter1_8_1519_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_8_1519_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_8_1519_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;flash.events.Event;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;flash.events.SampleDataEvent;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;flash.media.Sound;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;flash.net.URLRequest;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;flash.system.System;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;flash.utils.ByteArray;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
<img id="Codehighlighter1_237_1517_Open_Image" onclick="this.style.display='none'; Codehighlighter1_237_1517_Open_Text.style.display='none'; Codehighlighter1_237_1517_Closed_Image.style.display='inline'; Codehighlighter1_237_1517_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_237_1517_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_237_1517_Closed_Text.style.display='none'; Codehighlighter1_237_1517_Open_Image.style.display='inline'; Codehighlighter1_237_1517_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Extract&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_237_1517_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_237_1517_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;var&nbsp;sourceSnd:Sound&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Sound();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;var&nbsp;outputSnd:Sound&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Sound();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;var&nbsp;urlReq:URLRequest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;URLRequest(</span><span style="color: #000000">"</span><span style="color: #000000">11k.mp3</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">this&nbsp;file&nbsp;has&nbsp;575&nbsp;frames<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;var&nbsp;urlReq:URLRequest&nbsp;=&nbsp;new&nbsp;URLRequest("44k.mp3");&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">this&nbsp;file&nbsp;has&nbsp;1150&nbsp;frames</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;var&nbsp;samplesCount:uint&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
<img id="Codehighlighter1_621_893_Open_Image" onclick="this.style.display='none'; Codehighlighter1_621_893_Open_Text.style.display='none'; Codehighlighter1_621_893_Closed_Image.style.display='inline'; Codehighlighter1_621_893_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_621_893_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_621_893_Closed_Text.style.display='none'; Codehighlighter1_621_893_Open_Image.style.display='inline'; Codehighlighter1_621_893_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;function&nbsp;play():</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_621_893_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_621_893_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sourceSnd.load(urlReq);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sourceSnd.play();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;if&nbsp;use&nbsp;source&nbsp;sound&nbsp;to&nbsp;playing,&nbsp;we&nbsp;will&nbsp;not&nbsp;be&nbsp;got&nbsp;machine&nbsp;gun&nbsp;sound.</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sourceSnd.addEventListener(Event.COMPLETE,&nbsp;loaded);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">use&nbsp;this&nbsp;approach,&nbsp;we&nbsp;will&nbsp;be&nbsp;got&nbsp;stutter.</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
<img id="Codehighlighter1_946_1069_Open_Image" onclick="this.style.display='none'; Codehighlighter1_946_1069_Open_Text.style.display='none'; Codehighlighter1_946_1069_Closed_Image.style.display='inline'; Codehighlighter1_946_1069_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_946_1069_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_946_1069_Closed_Text.style.display='none'; Codehighlighter1_946_1069_Open_Image.style.display='inline'; Codehighlighter1_946_1069_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;function&nbsp;loaded(event:Event):</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_946_1069_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_946_1069_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputSnd.addEventListener(SampleDataEvent.SAMPLE_DATA,&nbsp;processSound);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputSnd.play();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
<img id="Codehighlighter1_1138_1510_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1138_1510_Open_Text.style.display='none'; Codehighlighter1_1138_1510_Closed_Image.style.display='inline'; Codehighlighter1_1138_1510_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_1138_1510_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1138_1510_Closed_Text.style.display='none'; Codehighlighter1_1138_1510_Open_Image.style.display='inline'; Codehighlighter1_1138_1510_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;function&nbsp;processSound(event:SampleDataEvent):</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1138_1510_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1138_1510_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;bytes:ByteArray&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ByteArray();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;samplesPerTime:uint&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sourceSnd.extract(bytes,&nbsp;</span><span style="color: #000000">8192</span><span style="color: #000000">);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;samplesCount&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;samplesPerTime;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace("samplesCount:"&nbsp;+&nbsp;samplesCount&nbsp;+&nbsp;",samplesPerTime:"&nbsp;+&nbsp;samplesPerTime);</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.data.writeBytes(bytes);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flash.system.System.gc();</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>
<br />
You can refer to following test steps for reproduce stutter/machine gun sound issue: <br />
&nbsp;<br />
1, Run/debug test application in Firefox, you will get smooth sound at once.<br />
&nbsp;<br />
2, Open a new tab in the same window, and open a heavy load web page (for example: http://www.taobao.com) <br />
&nbsp;<br />
3, You will get stutter when a heavy load page is loading.<br />
<br />
If you interest in this problem also, we can study it together.<br />
<img src ="http://www.blogjava.net/fastzch/aggbug/314592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Java World</a> 2010-03-05 12:15 <a href="http://www.blogjava.net/fastzch/archive/2010/03/05/314592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sound Extract Method Study</title><link>http://www.blogjava.net/fastzch/archive/2009/12/15/305917.html</link><dc:creator>Robin's Java World</dc:creator><author>Robin's Java World</author><pubDate>Tue, 15 Dec 2009 04:50:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2009/12/15/305917.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/305917.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2009/12/15/305917.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/305917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/305917.html</trackback:ping><description><![CDATA[We can use&nbsp;extract method of the sound class in Flex 4/Flash 10, the method is able to extract raw wave data from SWF object. The technology is new feature, I have used this new technology recently, and I have got some result:<br />
The extract&nbsp;method like a black box, we can't know what does it do. <br />
<br />
1, Extract low sample rate sound will be get more samples, I can't understand that why&nbsp;like this. I know that it will transfer&nbsp;all kind of&nbsp;sample rate to 44.1KHz, but we can't know that how to transfer?<br />
<br />
2, MPEG wave data is not bound to a single frame, so we need overlap some&nbsp;frames in a SWF sound what the sound compose of some frames. the overlap size is an experience value, in general, I set it as&nbsp;7 frames. The value is depend your parse frames and detail extract algorithm sometimes. Anyway,&nbsp;7 is my recommendation value.<br />
<br />
3, This method can provide some very useful function with SoundMixer class for extend your application. For instance, show wave shape, add some effect, etc.<br />
There is a sample for show waveform:<br />
<a href="http://www.bytearray.org/?p=329">http://www.bytearray.org/?p=329</a><br />
<br />
At last, I strong recommend an open source project, this project is a stream player based on Flex platform.<br />
<a href="http://code.google.com/p/as3mp3streamplayer/">http://code.google.com/p/as3mp3streamplayer/</a><br />
<br />
If you had deeply researched at this method, please communication with me. thank you!<br />
&nbsp;<br />
<br />
<img src ="http://www.blogjava.net/fastzch/aggbug/305917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Java World</a> 2009-12-15 12:50 <a href="http://www.blogjava.net/fastzch/archive/2009/12/15/305917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>