﻿<?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-我爱佳娃-随笔分类-Spring</title><link>http://www.blogjava.net/alwayscy/category/20896.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 24 Feb 2008 10:27:00 GMT</lastBuildDate><pubDate>Sun, 24 Feb 2008 10:27:00 GMT</pubDate><ttl>60</ttl><item><title>SPRING循环依赖(circular reference)的解决方法</title><link>http://www.blogjava.net/alwayscy/archive/2008/02/24/181726.html</link><dc:creator>我爱佳娃</dc:creator><author>我爱佳娃</author><pubDate>Sun, 24 Feb 2008 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/alwayscy/archive/2008/02/24/181726.html</guid><wfw:comment>http://www.blogjava.net/alwayscy/comments/181726.html</wfw:comment><comments>http://www.blogjava.net/alwayscy/archive/2008/02/24/181726.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/alwayscy/comments/commentRss/181726.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alwayscy/services/trackbacks/181726.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有时候，在SPRING中两个类互相含有对方的声明，一般情况这是不允许并且极可能是有错误的。<br>但有时候这正是我们想要的，考虑这种情况：<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/alwayscy/archive/2008/02/24/181726.html'>阅读全文</a><img src ="http://www.blogjava.net/alwayscy/aggbug/181726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alwayscy/" target="_blank">我爱佳娃</a> 2008-02-24 10:13 <a href="http://www.blogjava.net/alwayscy/archive/2008/02/24/181726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近在用JPA+SPRING+HIBERNATE及MAVEN2中遇到的问题和解决方法做个笔记</title><link>http://www.blogjava.net/alwayscy/archive/2008/01/28/178283.html</link><dc:creator>我爱佳娃</dc:creator><author>我爱佳娃</author><pubDate>Mon, 28 Jan 2008 15:08:00 GMT</pubDate><guid>http://www.blogjava.net/alwayscy/archive/2008/01/28/178283.html</guid><wfw:comment>http://www.blogjava.net/alwayscy/comments/178283.html</wfw:comment><comments>http://www.blogjava.net/alwayscy/archive/2008/01/28/178283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alwayscy/comments/commentRss/178283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alwayscy/services/trackbacks/178283.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JPA标准＋HIBERNATE实现＋SPINRG揉和<br>搭建MAVEN2的内网服务器：设置一个目录在WEB服务上可以访问<br>MYSQL可以被外部机器连接<br>cannot connect to VM错误&nbsp;&nbsp;<a href='http://www.blogjava.net/alwayscy/archive/2008/01/28/178283.html'>阅读全文</a><img src ="http://www.blogjava.net/alwayscy/aggbug/178283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alwayscy/" target="_blank">我爱佳娃</a> 2008-01-28 23:08 <a href="http://www.blogjava.net/alwayscy/archive/2008/01/28/178283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在spring中实现rmi回调(callback)功能</title><link>http://www.blogjava.net/alwayscy/archive/2007/06/21/125585.html</link><dc:creator>我爱佳娃</dc:creator><author>我爱佳娃</author><pubDate>Thu, 21 Jun 2007 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/alwayscy/archive/2007/06/21/125585.html</guid><wfw:comment>http://www.blogjava.net/alwayscy/comments/125585.html</wfw:comment><comments>http://www.blogjava.net/alwayscy/archive/2007/06/21/125585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alwayscy/comments/commentRss/125585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alwayscy/services/trackbacks/125585.html</trackback:ping><description><![CDATA[<p>spring包装了rmi后，使我们得到几点便利：</p>
<p>不用调用rmic编译stub和skeleton</p>
<p>不用直接实现remote接口</p>
<p>不需要启动命名服务rmiregistry</p>
<p>但，却不支持原来rmi的回调功能。查阅许多网页也不得其解。</p>
<p>&nbsp;</p>
<p>今天，想到一招，共享出来，如果大家有好办法欢迎回贴共享。</p>
<p>&nbsp;</p>
<p>正常做法是：</p>
<p>回调一般是用在一群client端需要server来通知的情况，一般server就用Vector来保存client对象。</p>
<p>server端需要提供一个方法，client把对象传过来后，保存到Vector中，以后就可以通知client们了：</p>
<p>register (ClientObject obj);</p>
<p>&nbsp;</p>
<p>在spring里，基本做法是一样的，唯一不同是，在这个方法里，client不能传对象，我们就传一个client提供出来的rmi对象的url：</p>
<p>register(String url);</p>
<p>&nbsp;</p>
<p>在client端，就如正常使用先获得server对象，再调用这个方法，注意组成url的代码：</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NodeService&nbsp;service&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(NodeService)&nbsp;factory.getAPIObject(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">nodeServiceProxy</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_108_198_Open_Image onclick="this.style.display='none'; Codehighlighter1_108_198_Open_Text.style.display='none'; Codehighlighter1_108_198_Closed_Image.style.display='inline'; Codehighlighter1_108_198_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_108_198_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_108_198_Closed_Text.style.display='none'; Codehighlighter1_108_198_Open_Image.style.display='inline'; Codehighlighter1_108_198_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_108_198_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_108_198_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">rmi://</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;InetAddress.getLocalHost().getHostName()&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/NodeNotifyService</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_221_222_Open_Image onclick="this.style.display='none'; Codehighlighter1_221_222_Open_Text.style.display='none'; Codehighlighter1_221_222_Closed_Image.style.display='inline'; Codehighlighter1_221_222_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_221_222_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_221_222_Closed_Text.style.display='none'; Codehighlighter1_221_222_Open_Image.style.display='inline'; Codehighlighter1_221_222_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(Exception&nbsp;ue)&nbsp;</span><span id=Codehighlighter1_221_222_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_221_222_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;service.registerFlower&nbsp;(name);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">result=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">result);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p>&nbsp;</p>
<p>在server端registerFlower处理里，根据url动态创建这个对象，代码如下：</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_52_787_Open_Image onclick="this.style.display='none'; Codehighlighter1_52_787_Open_Text.style.display='none'; Codehighlighter1_52_787_Closed_Image.style.display='inline'; Codehighlighter1_52_787_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_52_787_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_52_787_Closed_Text.style.display='none'; Codehighlighter1_52_787_Open_Image.style.display='inline'; Codehighlighter1_52_787_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;NodeServiceImpl&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;NodeService&nbsp;</span><span id=Codehighlighter1_52_787_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_52_787_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;Logger&nbsp;logger&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;LoggerFactory.getLogger(NodeServiceImpl.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;NodeNotifyService&nbsp;service&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_226_785_Open_Image onclick="this.style.display='none'; Codehighlighter1_226_785_Open_Text.style.display='none'; Codehighlighter1_226_785_Closed_Image.style.display='inline'; Codehighlighter1_226_785_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_226_785_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_226_785_Closed_Text.style.display='none'; Codehighlighter1_226_785_Open_Image.style.display='inline'; Codehighlighter1_226_785_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;registerFlower&nbsp;(String&nbsp;url)&nbsp;</span><span id=Codehighlighter1_226_785_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_226_785_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info&nbsp;(url);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RmiProxyFactoryBean&nbsp;rmiProxyFactoryBean&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;RmiProxyFactoryBean();&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rmiProxyFactoryBean.setServiceInterface(NodeNotifyService.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">begin&nbsp;set&nbsp;url</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rmiProxyFactoryBean.setServiceUrl(url);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_486_567_Open_Image onclick="this.style.display='none'; Codehighlighter1_486_567_Open_Text.style.display='none'; Codehighlighter1_486_567_Closed_Image.style.display='inline'; Codehighlighter1_486_567_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_486_567_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_486_567_Closed_Text.style.display='none'; Codehighlighter1_486_567_Open_Image.style.display='inline'; Codehighlighter1_486_567_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_486_567_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_486_567_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">begin&nbsp;set</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rmiProxyFactoryBean.afterPropertiesSet();&nbsp;<br><img id=Codehighlighter1_590_625_Open_Image onclick="this.style.display='none'; Codehighlighter1_590_625_Open_Text.style.display='none'; Codehighlighter1_590_625_Closed_Image.style.display='inline'; Codehighlighter1_590_625_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_590_625_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_590_625_Closed_Text.style.display='none'; Codehighlighter1_590_625_Open_Image.style.display='inline'; Codehighlighter1_590_625_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(Exception&nbsp;ex)&nbsp;</span><span id=Codehighlighter1_590_625_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_590_625_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">exception</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_697_769_Open_Image onclick="this.style.display='none'; Codehighlighter1_697_769_Open_Text.style.display='none'; Codehighlighter1_697_769_Closed_Image.style.display='inline'; Codehighlighter1_697_769_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_697_769_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_697_769_Closed_Text.style.display='none'; Codehighlighter1_697_769_Open_Image.style.display='inline'; Codehighlighter1_697_769_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(rmiProxyFactoryBean.getObject()&nbsp;</span><span style="COLOR: #0000ff">instanceof</span><span style="COLOR: #000000">&nbsp;NodeNotifyService)&nbsp;</span><span id=Codehighlighter1_697_769_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_697_769_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(NodeNotifyService)&nbsp;rmiProxyFactoryBean.getObject();&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>这样就从url转换成client对象了，当然了，还是需要在client和server各自配置文件里配置RmiServiceExporter，这一步很简单，和正常的spring的rmi是一样的了。<br><br>做到这步后，我还想把所有接口文件放到一个JAR里，client和server的实现，以及各自逻辑放到各自的JAR中，这样各自改实现就不需要两边更新包。改接口的话，就更新接口所在JAR。不知道这样安排是否合理？
<img src ="http://www.blogjava.net/alwayscy/aggbug/125585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alwayscy/" target="_blank">我爱佳娃</a> 2007-06-21 15:46 <a href="http://www.blogjava.net/alwayscy/archive/2007/06/21/125585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring远程服务比较和编程注意事项</title><link>http://www.blogjava.net/alwayscy/archive/2007/06/08/122915.html</link><dc:creator>我爱佳娃</dc:creator><author>我爱佳娃</author><pubDate>Fri, 08 Jun 2007 10:53:00 GMT</pubDate><guid>http://www.blogjava.net/alwayscy/archive/2007/06/08/122915.html</guid><wfw:comment>http://www.blogjava.net/alwayscy/comments/122915.html</wfw:comment><comments>http://www.blogjava.net/alwayscy/archive/2007/06/08/122915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alwayscy/comments/commentRss/122915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alwayscy/services/trackbacks/122915.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>完整文章在<a href="http://developer.51cto.com/art/200611/34262.htm">这里</a></p> <p>&nbsp;</p> <p>文章写得比较易懂清晰，最后倾向于用HTTP Invoker，是轻量级的易于安装而灵活的方案，但它只在通信两边都是SPRING时适用。</p> <p>&nbsp;</p> <p>要点如下：</p> <p>每一种远程技术都有其优点与不足，表格1对它们进行了简单的对比。 <p><b>按框架 </b><b>优点 </b><b>缺点分述如下：</b> <p><b>RMI</b> <p>全面支持Java对象串行化。因此，你能够通过网络发送复杂数据类型。 <p>RMI仅是一种Java到Java型远程方案。如果你拥有任何非Java客户端的话，那么你无法使用它。另外，你还无法通过HTTP协议存取对象，除非你有专门的“通道”实现RMI通讯。注意，它需要一个RMI编译器(为了生成代理和框架)和一个外部注册表(用于查询服务)。 <p><b>Hessian/Burlap</b> <p>跨防火墙工作良好 <p>它们使用一种专利对象串行化机制。其中，Burlap仅支持Java客户端。它们能够串行化Hibernate对象，但是对集合对象执行“惰式”加载。 <p><b>HTTP Invoker</b> <p>基于HTTP的Java到Java Remoting；通过HTTP实现Java串行化；容易建立。 <p>服务器和客户端应用程序都需要使用Spring。 <p>仅是一种Java方案。 <p><b>EJB</b> <p>支持Remoting J2EE服务，应用程序安全以及事务处理 <p>EJB是一种重量级技术。它要求使用一个J2EE容器。 <p><b>Web</b><b>服务</b> <p>平台和语言独立 <p>要付出SOAP操作所带来的开销，并且要求使用一个Web服务引擎。 <p><strong>表格1：各种Spring Remoting技术优缺点比较</strong> <p>如你所见，每一种Spring Remoting技术都有各自的优缺点，但是大多数实际的应用程序都会要求使用一种轻量级Remoting技术。当实现远程服务时，使用例如EJB这样的重量级远程组件模型需要其它额外的开销。通常情况下，使用一种支持对象串行化能力的HTTP服务就足够了。</p><img src ="http://www.blogjava.net/alwayscy/aggbug/122915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alwayscy/" target="_blank">我爱佳娃</a> 2007-06-08 18:53 <a href="http://www.blogjava.net/alwayscy/archive/2007/06/08/122915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>