??xml version="1.0" encoding="utf-8" standalone="yes"?>
以上是摘取官方网站上提供的一个叫errorhandler的例子里配置文g的一部分Qmule-descriptor节点是用来描qC个UMOlg的,在这个配|文仉提供?jin)两个UMOlgQ在每一个UMOlg里有一个或多个端点QendpintQ来接收或发送事件。也怽?x)觉得这个配|文件过于复杂,以至于无法理解。没关系Q在以后的文章里会(x)q一步解释?br />
有h可能?x)说QMule只是一个Jms实现Q然而Mule不仅仅是一个Jms服务器,而且可以通过配置来用几乎所有的Jms服务Q比如说ActiveMq、JBoss MQ、Joram OpenJms、Oracle AQ、SeeBeyond、Spirit Wave?UberMQ、Weblogic Jms (tng)?IBM WebSphere MQ。与Spring一PMule不会(x)重复造轮子,而是?x)用在当今开源社区里成熟的品。比如在webservice上,Mule支持glue、axis和xfire。对于不同类型的q接Q比如说jms和webserviceQ,Mule提供?jin)一致的服务来管理事件的向、联pR事务、安全和审核?br />
tomcat5.exe //US//Tomcat5 --JvmMs=128 --JvmMx=512
普通版
讄CATALINA_OPTS -Xmx512m
TOMCAT_OPTS -Xmx512m
]]>
l合考虑后,我决定用applet在客L(fng)q行一D代码。在客户端里用apache的开源项目httpClient模拟httphQ如输入用户名密码登陆,览某个q接下蝲{)(j)。由于要涉及(qing)到读写客L(fng)的磁盘文Ӟ所以在客户端运行程序的时候必定会(x)抛出securityException。当时在q里折腾?jin)很久,老是把注意力里集中在修改客户端的安全{略文g上?br />事实上,有一U更好的办法Q那是对appletE序所依赖的jar包进行数字签名?br />步骤如下Q?br />打开命o(h)行窗口,定位?span lang="EN-US">c:/目录下?br />1?span lang="EN-US">keytool -genkey -keystore pepper.store -alias pepper
q个命o(h)用来产生一个密匙库Q执行完毕后应该?span lang="EN-US">c:/中生一?span lang="EN-US">pepper.store的文Ӟq里?span lang="EN-US">pepper是我自己的名字,你可以对它进行修攏V另外在执行命o(h)的时候还有提CZ输入密匙库的密码Q这里你一定要CQ否则后面要用的时候无法输入?br />
2?/font>
keytool -export -keystore pepper.store -alias pepper -file pepper.cert
q个命o(h)用来产生{时所要用的证书,同样q里?span lang="EN-US">pepper也可以换成你自己需要的名字。这个命令执行完后在c:/中生一?span lang="EN-US">pepper.cert的文件?br />
3?/font>
jarsigner -keystore pepper.store myapplet.jar pepper
q个命o(h)用上面生的证书我们的jar文gq行?jin)签名。(myapplet.jar是我们项目中所依赖的jar包)(j)
执行完以上三步之后,已l完全可以了(jin)。而不需要像|上某些文章说的那样q要修改客户端的安全{略文g?br />最后在面上把applet标记加上
<applet code="Tasdf.class" CODEBASE = "." archive="myapplet.jar" width=30 height=15>
</applet>
]]>
Mule应用E序通常是通过|络p多Mule实例l成Q实际上一个应用里面只能有一个mule实例Q因为实例启动之后必d用一个tcp端口Q,每一个实例是由具有一个或多个UMOlg的轻量容器所构成Q每一个UMOlg都包含有一个或多个能收发事件的端点?br />以上描述可以用以下图例来说明Q?br />
实际上Mule是用一个配|文件来描述以上信息的,一个典型的配置文g如下Q?br />
<
mule-descriptor (tng)
name
="Error (tng)Manager"
(tng)implementation
="errorManager"
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
inbound-router
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
endpoint (tng)
address
="file://./test-data/in"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)transformers
="XMLToExceptionBean (tng)ExceptionBeanToErrorMessage"
(tng)
/>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
</
inbound-router
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
outbound-router
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
catch-all-strategy (tng)
className
="org.mule.routing.LoggingCatchAllStrategy"
/>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
router (tng)
className
="org.mule.routing.outbound.FilteringOutboundRouter"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)transformer
="ErrorMessageToException"
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
endpoint (tng)
address
="file://./test-data/exceptions"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)transformers
="ErrorMessageToExceptionBean (tng)ExceptionBeanToXML"
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
properties
><
property (tng)
name
="outputPattern"
(tng)value
="Exception-${UUID}.xml"
(tng)
/></
properties
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
</
endpoint
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
filter (tng)
className
="org.mule.routing.filters.PayloadTypeFilter"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)expectedType
="org.mule.MuleException"
(tng)
/>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
</
router
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
router (tng)
className
="org.mule.routing.outbound.FilteringOutboundRouter"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)transformer
="ErrorMessageToException"
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
endpoint (tng)
address
="smtp://?address=${email.toAddress}"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)transformers
="ErrorMessageToExceptionBean (tng)ExceptionBeanToXML (tng)StringToEmailMessage"
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
properties
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
property (tng)
name
="fromAddress"
(tng)value
="${email.fromAddress}"
(tng)
/>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
property (tng)
name
="subject"
(tng)value
="${email.subject}"
(tng)
/>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
</
properties
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
</
endpoint
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
filter (tng)
className
="org.mule.routing.filters.PayloadTypeFilter"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)expectedType
="org.mule.umo.lifecycle.FatalException"
/>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
</
router
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
router (tng)
className
="org.mule.routing.outbound.FilteringOutboundRouter"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)transformer
="ErrorMessageToException"
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
endpoint (tng)
address
="jms://exception.queue"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)transformers
="ErrorMessageToExceptionBean (tng)ExceptionBeanToXML (tng)ObjectToJMSMessage"
/>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
filter (tng)
className
="org.mule.routing.filters.PayloadTypeFilter"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)expectedType
="org.mule.samples.errorhandler.exceptions.BusinessException"
/>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
</
router
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
</
outbound-router
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
interceptor (tng)
name
="default"
/>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
</
mule-descriptor
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
mule-descriptor (tng)
name
="Business (tng)Error (tng)Manager"
(tng)implementation
="businessErrorManager"
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
inbound-router
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<
endpoint (tng)
address
="jms://exception.queue"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)transformers
="JMSMessageToObject (tng)XMLToExceptionBean (tng)ExceptionBeanToErrorMessage"
(tng)
/>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
</
inbound-router
>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
</
mule-descriptor
>
在Mule容器里面为UMOlg提供?jin)一pd的服务,例如事务理Q事件{化,路由Q事件审核和理{,Mule对象分开理意味着可以UMOlg交给当前行的IOC容器Q比如springQ去构造。虽然Mule声称与spring可以完美l合Q然而在我通过一pd实验中发玎ͼMule与springl合q是有许多bug的,希望Mule能在下一个版本的更新中解冟?br />
在用Mule之前Q很有必要理解一些核?j)的概念和专业术语。以下图表简单的描述?jin)一个Mule服务器的l成
下面对图表上的每一个概念进行解释?/font>
The Mule Manager
Mule理器是Mule实例的中?j),它的主要作用是管理Mule实例中各U各L(fng)对象Q例如:(x)q接器、端炏V{换器。这些对象被用来控制在组件中消息的流转以?qing)向lg理的模型提供服务?br />
The Model
模型是在你组件中被管理和执行的容器,它控制着消息在你lg里的收和发。默认的Mule模型是基于SEDA的,q意味着它用了(jin)一U高效的Z消息队列的模型来辑ֈ最佳的性能?br />
UMO Components
UMO也就是Universal Message ObjectQ通用消息对象Q,q是一U能从Q何地Ҏ(gu)发时间的对象。UMO对象可以是你的业务对象,在消息进来的时候执行你的业务逻辑Q这是一U标准的JavaBeanQ没有Q何特D的Mule代码在你的组ӞUMO对象Q里面,Mule是如何在你的对象里进行消息收发的路由和{换取决于你在lg里的配置?br />
Endpoints
端点是Mule通信能力的基本原理。一个端点定义在两个或者更多组件之间的通信渠道。可以通过配置消息qo(h)器、安全拦截器和事务处理来控制一个端Ҏ(gu)如何消息收与发的?br />
External Applications
外部应用可以是Q何的遗留pȝ。基本上QQ何应用只要有一U数据传输方式能通过Mule的端点进行通信QUMOlg是不兛_(j)是哪个应用提供的数据、应用部|的地点以及(qing)是用何种传输协议的?/font>
]]>
关于IT企业
中国的IT企业Q尤其是民营企业的许多不规范q在M时代有所?jin)解的,但到了(jin)工作之后才深刻的体会(x)到。项目只有少得可怜的文档Q许多代码编写都不规范。过分追求功能点的完成,而忽视了(jin)目的可扩展性,q导致当客户有新需求到来的时候,只会(x)对客戯行抱怨,说这个需求要改原来的很多内容。而没有从自己的设计思\上找原因。我们是IT提供者,我们要充分的挖掘客户所需要但却暂时没法提出的需求。不q,后来xQQ何一个成长中的企业都必须l过q么一个O长而曲折的q程。所以出现这些问题都是无可厚非的Q关键是从这些问题(sh)U篏l验?br />
关于工作
IT人真是篏Q记得刚来公司的一D|间里Q由于我在学校已有一定的JavaEE斚w的实践我有q参与了(jin)一个大型项目的开发工作,而由于项目比较紧的原因,整个目l每天晚上都在加班。星期六星期天往往只有一天的休息旉Q虽然辛苦,但那时候的日子q得很充实。以至于在后来不用加班的日子里,反而觉得莫明的IQ不知道q是自己作ؓ(f)一个IT人感到高兴还是应该感到?zhn)哀。(我想高兴的只有公司的老板们吧Q?img height="19" src="http://www.aygfsteel.com/Emoticons/sad_smile.gif" width="19" border="0" />Q?br />
关于学习(fn)
搞开发的必须不断学习(fn)Q这是众所周知的。而且必须在长旉的压力下工作Q因为技术的发展是日新月异的Q往往是q个原因让许多IT从业者却步。记得以前有个同事跟我说的,“学h崖,回头是岸”。当时听?jin)觉得好W,现在回想Pq不无道理啊。其他行业的下了(jin)班之后都可以d的放松,公务员就更不用说?jin),不要说是下班之后Q就是上班旉也是上上|,看下报纸q样打发旉。而我们呢Q经帔R必须加班加点的工作,q下班之后Q也得看书学?fn),因?f)如果不看总觉得心(j)里不塌实。。以前读书时代从来没有象现在q样q么d学习(fn)的,总而言之作Z个IT从业者,一个字Q篏Q?br />
关于生活
虽然qx工作J忙Q但是我觉得生活q得q是挺充实的Q因为我对Y件开发感兴趣Q也是q个兴趣推动我不断的学习(fn)Q以?qing)寻求工作中的乐。不知道q个兴趣能把我维持多久,因ؓ(f)人d有其他事情啊Q比如感情,家庭{。。说到感情,曄情感不断的我在这一q时间里感情世界q乎I白Q把所有的旉都献l了(jin)工作和学?fn)?jin)。?zhn)哀Q希望在未来的一q里有所改观吧?br />
ȝ
今天?1?4Pd的这个日子,正好走出校门来到q家公司实习(fn)Q没惛_一实习(fn)׃直呆在这家公叔R工作?jin),以至于后来的毕业论文也是在公叔R完成的,q回d校答辩的旉都没有。ؓ(f)?jin)能在今天把q篇东西发表?jin),写得太草率?br />
q期在关注一个开源的企业UESBpȝȝMule,因ؓ(f)在项目中需要用的。在以后的文章里?x)谈谈这斚w的学?fn)体会(x)?/font>
]]>
选择在blogjava建blog,除了(jin)自己是名javaer之外,主要原因是因为在q里潜水半年多的旉里学C(jin)不少东西,所以决定以后要多做点奉?..写写文章啊什么的,
d四年大学,现在回想h,好象没什么另自己特别印象深刻的东?..N是没有一点值得回忆的吗?我觉得不?很多值得怀늚事情都忘得差不多?jin)?
Z(jin)使自׃白过,若干q后可以扑֛曄的回?.所以我军_以后要常上来写点东西?img height="19" src="http://www.aygfsteel.com/Emoticons/shades_smile.gif" width="19" border="0" />
马上p到工作一q的旉?我决定在下篇文章里写写自p一q来的各斚w的ȝ.