<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Piotr Gabryanczyk's Blog &#187; programming</title>
	<atom:link href="http://piotrga.wordpress.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://piotrga.wordpress.com</link>
	<description>Java, Refactoring, AOP, Spring, DDD, TDD, etc.</description>
	<lastBuildDate>Mon, 29 Jun 2009 09:47:45 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='piotrga.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/d2a4bd750e12ba6846cb9ee2dea2ea8e?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Piotr Gabryanczyk's Blog &#187; programming</title>
		<link>http://piotrga.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://piotrga.wordpress.com/osd.xml" title="Piotr Gabryanczyk&#8217;s Blog" />
		<item>
		<title>ANT script good practices &#8211; few thoughts</title>
		<link>http://piotrga.wordpress.com/2008/09/15/ant-script-good-practices-few-thoughts/</link>
		<comments>http://piotrga.wordpress.com/2008/09/15/ant-script-good-practices-few-thoughts/#comments</comments>
		<pubDate>Mon, 15 Sep 2008 12:44:43 +0000</pubDate>
		<dc:creator>Piotr Gabryanczyk</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[good practices]]></category>

		<guid isPermaLink="false">http://piotrga.wordpress.com/?p=42</guid>
		<description><![CDATA[In general scripts should be treated as first class citizens, so they need to be simple, modular, clean, easy to read and understand and loosely coupled.

Here are some techniques which should help with it:
All the OO principles apply!
When you need custom functionality for your project i.e. custom make step &#8211; do not bloat the common [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=piotrga.wordpress.com&blog=595023&post=42&subd=piotrga&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><div style="font-size:130%;">In general scripts should be treated as <strong>first class citizens</strong>, so they need to be <strong>simple, modular, clean, easy to read and understand and loosely coupled</strong>.
</div>
<h2>Here are some techniques which should help with it:</h2>
<h3>All the OO principles apply!</h3>
<p>When you need custom functionality for your project i.e. custom make step &#8211; do not bloat the common files with conditional logic. Extract common stuff to macrodefs and create separate files and/or targets for custom functionality in local project directory. Basically <strong>all the OO principles apply!</strong></p>
<h3>Break it down and modularize</h3>
<p>You wouldn&#8217;t like to have just one big class in your project &#8211; do the same with ant script, <strong>break it down and modularize</strong></p>
<h3>Stop writing generic ant targets parametrized by global properties</h3>
<p>Replace them with <strong>macrodefs</strong>. See:<br />
<a href="http://ant.apache.org/manual/CoreTasks/macrodef.html">http://ant.apache.org/manual/CoreTasks/macrodef.html</a></p>
<h3>Stop using global properties</h3>
<p>Don&#8217;t use them, unless they are really global i.e. project.name, project.version. In general they are evil as global variables and singletons are. See:<br />
<a href="http://blogs.msdn.com/scottdensmore/archive/2004/05/25/140827.aspx">http://blogs.msdn.com/scottdensmore/archive/2004/05/25/140827.aspx</a><br />
<a href="http://www.cs.usfca.edu/~wolber/courses/110/lectures/globals.htm">http://www.cs.usfca.edu/~wolber/courses/110/lectures/globals.htm</a></p>
<h3>Use convention over configuration design paradigm.</h3>
<p>What does it mean? Basically this:<br />
Instead of writing (unneccessary abstraction and complexity):<br />
<code><br />
&lt;property name="project.dir" value="${basedir}"/&gt;<br />
&lt;property name="test.result.dir" value="${project.dir}/build/testresult"/&gt;<br />
&lt;javadoc dest="${test.result.dir}&gt;<br />
...<br />
</code></p>
<p>We would write:<br />
<code><br />
&lt;javadoc dest="build/testresult"&gt;<br />
...<br />
</code><br />
Simpler and more readable!<br />
See more here:<br />
<a href="http://en.wikipedia.org/wiki/Convention_over_Configuration">http://en.wikipedia.org/wiki/Convention_over_Configuration</a></p>
<h3>Use maven-like project directory structure</h3>
<p>This supports convention over configuration approach and simplifies your build scripts.</p>
<pre>
project
- src
  +- main
     +- java
     +- config
     +- scripts
     +- ...
  +- test
     +- java
     +- config
     +- ...
- lib
  +- compile
  +- runtime
     +- spring-2.0.jar
     +- jakarta-commons
        +- commons-io.jar
        +- commons-???.jar
     +- ...
  +- test
- ant (contains common ant tasks - it should be symbolic link as this scripts should be shared)
  +- ant-common.xml
  +- ant-test.xml
  +- ...
- target ( temporary directory, only RW area of the project, equivalent to build)
- modules (if the code contains modules build separately like c++)
  +- SomeNativeLib
      +- src
      +- lib
      +- ...
  +- OtherJavaModule
      +- src
      +- lib
      +- ...
- build.xml
</pre>
<p><strong>Enjoy!</strong></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/piotrga.wordpress.com/42/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/piotrga.wordpress.com/42/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/piotrga.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/piotrga.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/piotrga.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/piotrga.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/piotrga.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/piotrga.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/piotrga.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/piotrga.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/piotrga.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/piotrga.wordpress.com/42/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=piotrga.wordpress.com&blog=595023&post=42&subd=piotrga&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://piotrga.wordpress.com/2008/09/15/ant-script-good-practices-few-thoughts/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d9b2bf89a10d0dfd765c2e95e8435bd8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr Gabryanczyk</media:title>
		</media:content>
	</item>
		<item>
		<title>Aspect Oriented Programming &#8211; real life examples</title>
		<link>http://piotrga.wordpress.com/2008/04/01/aspect-oriented-programming-real-live-examples/</link>
		<comments>http://piotrga.wordpress.com/2008/04/01/aspect-oriented-programming-real-live-examples/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 14:55:17 +0000</pubDate>
		<dc:creator>Piotr Gabryanczyk</dc:creator>
				<category><![CDATA[aop]]></category>
		<category><![CDATA[aspectj]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://piotrga.wordpress.com/?p=26</guid>
		<description><![CDATA[Some time ago, on my previous blog, I wrote a short series of articles showing real live examples of using AOP. It is time to group them together and share with you again:

Introduction and caching example Transparent Caching with AspectJ
Tracing history of bean with AspectJ in 10 minutes
Retry if failed pattern with AspectJ in 10 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=piotrga.wordpress.com&blog=595023&post=26&subd=piotrga&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Some time ago, on my <a href="http://www.jroller.com/piotrga/">previous blog</a>, I wrote a short series of articles showing real live examples of using AOP. It is time to group them together and share with you again:</p>
<ul>
<li>Introduction and caching example <a href="http://www.jroller.com/piotrga/entry/transparent_caching_with_aspectj">Transparent Caching with AspectJ</a></li>
<li><a href="http://www.jroller.com/piotrga/entry/tracing_history_of_bean_with">Tracing history of bean with AspectJ in 10 minutes</a></li>
<li><a href="http://www.jroller.com/piotrga/entry/retry_if_failed_with_aop">Retry if failed pattern with AspectJ in 10 minutes</a></li>
<li><a href="http://www.jroller.com/piotrga/entry/configurable_without_spring_in_10">@Configurable without Spring in 10 minutes</a></li>
</ul>
<p><strong>Enjoy!</strong></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/piotrga.wordpress.com/26/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/piotrga.wordpress.com/26/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/piotrga.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/piotrga.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/piotrga.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/piotrga.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/piotrga.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/piotrga.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/piotrga.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/piotrga.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/piotrga.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/piotrga.wordpress.com/26/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=piotrga.wordpress.com&blog=595023&post=26&subd=piotrga&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://piotrga.wordpress.com/2008/04/01/aspect-oriented-programming-real-live-examples/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d9b2bf89a10d0dfd765c2e95e8435bd8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr Gabryanczyk</media:title>
		</media:content>
	</item>
		<item>
		<title>Have you heard about Dryfus Model?</title>
		<link>http://piotrga.wordpress.com/2008/03/28/have-you-heard-about-dryfus-model/</link>
		<comments>http://piotrga.wordpress.com/2008/03/28/have-you-heard-about-dryfus-model/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 13:18:45 +0000</pubDate>
		<dc:creator>Piotr Gabryanczyk</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://piotrga.wordpress.com/?p=25</guid>
		<description><![CDATA[Very interesting point of view at the learning process:


http://www.infoq.com/articles/better-best-practices


http://pragdave.pragprog.com/pragdave/2004/04/end_of_the_know.html


Second one by Dave Thomas I also heard on QCon 2007. I hope someone recorded it. It was a really great talk.
I guess in the context of Agile, many of the teams I observed are still at the novice, maybe advanced beginner stage&#8230;
     [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=piotrga.wordpress.com&blog=595023&post=25&subd=piotrga&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Very interesting point of view at the learning process:</p>
<ul>
<li>
<a href="http://www.infoq.com/articles/better-best-practices">http://www.infoq.com/articles/better-best-practices</a>
</li>
<li>
<a href="http://pragdave.pragprog.com/pragdave/2004/04/end_of_the_know.html">http://pragdave.pragprog.com/pragdave/2004/04/end_of_the_know.html</a>
</li>
</ul>
<p>Second one by Dave Thomas I also heard on QCon 2007. I hope someone recorded it. It was a really great talk.</p>
<p>I guess in the context of Agile, many of the teams I observed are still at the novice, maybe advanced beginner stage&#8230;</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/piotrga.wordpress.com/25/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/piotrga.wordpress.com/25/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/piotrga.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/piotrga.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/piotrga.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/piotrga.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/piotrga.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/piotrga.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/piotrga.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/piotrga.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/piotrga.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/piotrga.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=piotrga.wordpress.com&blog=595023&post=25&subd=piotrga&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://piotrga.wordpress.com/2008/03/28/have-you-heard-about-dryfus-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d9b2bf89a10d0dfd765c2e95e8435bd8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr Gabryanczyk</media:title>
		</media:content>
	</item>
		<item>
		<title>RmiCluster &#8211; working alternative for cluster4spring</title>
		<link>http://piotrga.wordpress.com/2007/08/22/rmicluster-working-alternative-for-cluster4spring/</link>
		<comments>http://piotrga.wordpress.com/2007/08/22/rmicluster-working-alternative-for-cluster4spring/#comments</comments>
		<pubDate>Wed, 22 Aug 2007 10:26:51 +0000</pubDate>
		<dc:creator>Piotr Gabryanczyk</dc:creator>
				<category><![CDATA[cluster]]></category>
		<category><![CDATA[concurrent]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://piotrga.wordpress.com/2007/08/22/rmicluster-working-alternative-for-cluster4spring/</guid>
		<description><![CDATA[Business problem
I recently spent couple of weeks on writing a distributed Market Data Service for my client. The requirement was to distribute the load on couple of machines as MDS was meant to be used by few hundred node grid.
Cluster4Spring
We investigated couple of options and decided to go for Cluster4Spring. It gave us load distribution, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=piotrga.wordpress.com&blog=595023&post=21&subd=piotrga&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h2>Business problem</h2>
<p>I recently spent couple of weeks on writing a distributed Market Data Service for my client. The requirement was to distribute the load on couple of machines as MDS was meant to be used by few hundred node grid.</p>
<h2>Cluster4Spring</h2>
<p>We investigated couple of options and decided to go for Cluster4Spring. It gave us load distribution, failover and dynamic discovery.</p>
<h2>Failed under load</h2>
<p>After couple of days of testing it turned out that we needed to switch the dynamic discovery off as some client nodes were failing to find MDS. This left us with predefined list of RMI endpoints. Unfortunately few days later we realised that some of the nodes were loosing connections to all MDS instances in the middle of the job. I ruled out the network problems. MDS instances were not overloaded, so they were not dropping connections. BTW it struck me that a single node could only handle 50 requests per second. Internal processing of request was taking no more than 1ms ( return map.get(key) ). I tried different config options but nothing helped.</p>
<h2>RmiCluster</h2>
<p>At this point I was desperate enough to write my own clustering proxy to replace Cluster4Spring. When I thought about it, it looked like simple task to do. You maintain a list of alive nodes, refresh it periodically. If invocation fails remove node from the list. When invoking you just pick random remote node and that is it.</p>
<p>It took me 150 lines, and hey, it works! Single node is able to handle in excess of 100 requests per second.</p>
<p>To use it just expose your beans using spring RmiServiceExporter on the server side:</p>
<pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-color:#000000;border-style:solid;border-width:0.01mm;padding:4px;"><span style="color:#800000;">  1 </span><span style="background-color:#ffffff;">    </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">bean</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">class=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"org.springframework.remoting.rmi.RmiServiceExporter"</span><span style="background-color:#efefef;">&gt;
</span><span style="color:#800000;">  2 </span><span style="background-color:#ffffff;">        </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">property</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">name=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"serviceName"</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">value=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"serviceX"</span><span style="background-color:#efefef;">/&gt;
</span><span style="color:#800000;">  3 </span><span style="background-color:#ffffff;">        </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">property</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">name=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"service"</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">ref=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"MarketDataService"</span><span style="background-color:#efefef;">/&gt;
</span><span style="color:#800000;">  4 </span><span style="background-color:#ffffff;">        </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">property</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">name=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"serviceInterface"</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">value=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"com.XXX.marketdata.server.MarketDataServer"</span><span style="background-color:#efefef;">/&gt;
</span><span style="color:#800000;">  5 </span><span style="background-color:#ffffff;">        </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">property</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">name=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"registry"</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">ref=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"RMIRegistry"</span><span style="background-color:#efefef;">/&gt;
</span><span style="color:#800000;">  6 </span><span style="background-color:#ffffff;">    </span><span style="background-color:#efefef;">&lt;/</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">bean</span><span style="background-color:#efefef;">&gt;</span></pre>
<p>On the client side it could look like this:</p>
<pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-color:#000000;border-style:solid;border-width:0.01mm;padding:4px;"><span style="color:#800000;">  1 </span><span style="background-color:#ffffff;">    </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">bean</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">name=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"MarketDataService"</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">class=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"org.javaexpert.rmicluster.ClusteringRmiProxyFactoryBean"</span><span style="background-color:#efefef;">&gt;
</span><span style="color:#800000;">  2 </span><span style="background-color:#ffffff;">        </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">property</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">name=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"serviceInterface"</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">value=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"com.XXX.marketdata.server.MarketDataServer"</span><span style="background-color:#efefef;">/&gt;
</span><span style="color:#800000;">  3 </span><span style="background-color:#ffffff;">        </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">property</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">name=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"serviceUrl"</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">value=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"whatever"</span><span style="background-color:#efefef;">/&gt;
</span><span style="color:#800000;">  4 </span><span style="background-color:#ffffff;">        </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">property</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">name=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"serviceUrls"</span><span style="background-color:#efefef;">&gt;
</span><span style="color:#800000;">  5 </span><span style="background-color:#ffffff;">            </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">list</span><span style="background-color:#efefef;">&gt;
</span><span style="color:#800000;">  6 </span><span style="background-color:#ffffff;">                </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">value</span><span style="background-color:#efefef;">&gt;</span><span style="background-color:#ffffff;font-weight:bold;">rmi://somehost1:1234/ServiceX</span><span style="background-color:#efefef;">&lt;/</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">value</span><span style="background-color:#efefef;">&gt;
</span><span style="color:#800000;">  7 </span><span style="background-color:#ffffff;">                </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">value</span><span style="background-color:#efefef;">&gt;</span><span style="background-color:#ffffff;font-weight:bold;">rmi://somehost2:1234/ServiceX</span><span style="background-color:#efefef;">&lt;/</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">value</span><span style="background-color:#efefef;">&gt;
</span><span style="color:#800000;">  8 </span><span style="background-color:#ffffff;">                </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">value</span><span style="background-color:#efefef;">&gt;</span><span style="background-color:#ffffff;font-weight:bold;">rmi://somehost3:1234/ServiceX</span><span style="background-color:#efefef;">&lt;/</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">value</span><span style="background-color:#efefef;">&gt;
</span><span style="color:#800000;">  9 </span><span style="background-color:#ffffff;">                </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">value</span><span style="background-color:#efefef;">&gt;</span><span style="background-color:#ffffff;font-weight:bold;">rmi://somehost4:1234/ServiceX</span><span style="background-color:#efefef;">&lt;/</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">value</span><span style="background-color:#efefef;">&gt;
</span><span style="color:#800000;"> 10 </span><span style="background-color:#ffffff;">            </span><span style="background-color:#efefef;">&lt;/</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">list</span><span style="background-color:#efefef;">&gt;
</span><span style="color:#800000;"> 11 </span><span style="background-color:#ffffff;">        </span><span style="background-color:#efefef;">&lt;/</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">property</span><span style="background-color:#efefef;">&gt;
</span><span style="color:#800000;"> 12 </span><span style="background-color:#ffffff;">        </span><span style="background-color:#efefef;">&lt;</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">property</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">name=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"lookupStubOnStartup"</span><span style="background-color:#efefef;"> </span><span style="color:#0000ff;background-color:#efefef;font-weight:bold;">value=</span><span style="color:#008000;background-color:#efefef;font-weight:bold;">"true"</span><span style="background-color:#efefef;">/&gt;
</span><span style="color:#800000;"> 13 </span><span style="background-color:#ffffff;">    </span><span style="background-color:#efefef;">&lt;/</span><span style="color:#000080;background-color:#efefef;font-weight:bold;">bean</span><span style="background-color:#efefef;">&gt;
</span><span style="color:#800000;"> 14 </span></pre>
<p>ClusteringRmiProxyFactoryBean:</p>
<pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-color:#000000;border-style:solid;border-width:0.01mm;padding:4px;"><span style="color:#800000;">  1 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">package</span><span style="background-color:#ffffff;"> org</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">javaexpert</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">rmicluster</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">  2
  3 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.net.MalformedURLException;
</span><span style="color:#800000;">  4 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.rmi.NotBoundException;
</span><span style="color:#800000;">  5 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> java</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">rmi</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">Remote</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">  6 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.rmi.RemoteException;
</span><span style="color:#800000;">  7 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.rmi.registry.LocateRegistry;
</span><span style="color:#800000;">  8 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> java</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">rmi</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">registry</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">Registry</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">  9 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.util.ArrayList;
</span><span style="color:#800000;"> 10 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.util.HashMap;
</span><span style="color:#800000;"> 11 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> java</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">util</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">List</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 12 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> java</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">util</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">Map</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 13 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.util.Random;
</span><span style="color:#800000;"> 14 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.util.Timer;
</span><span style="color:#800000;"> 15 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> java</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">util</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">TimerTask</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 16 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.util.regex.Matcher;
</span><span style="color:#800000;"> 17 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.util.regex.Pattern;
</span><span style="color:#800000;"> 18
 19 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> org</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">aopalliance</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">intercept</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">MethodInvocation</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 20 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">org.javaexpert.error.ErrorUtils;
</span><span style="color:#800000;"> 21 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> org</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">springframework</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">beans</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">factory</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">DisposableBean</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 22 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">org.springframework.remoting.RemoteAccessException;
</span><span style="color:#800000;"> 23 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">org.springframework.remoting.RemoteLookupFailureException;
</span><span style="color:#800000;"> 24 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">org.springframework.remoting.rmi.RmiProxyFactoryBean;
</span><span style="color:#800000;"> 25
 26
 27 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">class</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">ClusteringRmiProxyFactoryBean </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">extends</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">RmiProxyFactoryBean </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">implements</span><span style="background-color:#ffffff;"> DisposableBean{
</span><span style="color:#800000;"> 28 </span><span style="background-color:#ffffff;">    </span><span style="color:#808080;background-color:#ffffff;font-style:italic;">// Inputs
</span><span style="color:#800000;"> 29 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> List&lt;</span><span style="color:#000080;background-color:#ffffff;">String&gt;</span><span style="background-color:#ffffff;"> </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">serviceUrls;
</span><span style="color:#800000;"> 30 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">int</span><span style="background-color:#ffffff;"> </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">refreshEndpointsMillis </span><span style="background-color:#ffffff;">= </span><span style="color:#0000ff;background-color:#ffffff;">60</span><span style="background-color:#ffffff;">*</span><span style="color:#0000ff;background-color:#ffffff;">1000</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 31
 32 </span><span style="background-color:#ffffff;">    </span><span style="color:#808080;background-color:#ffffff;font-style:italic;">// Internals
</span><span style="color:#800000;"> 33 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> Map&lt;</span><span style="color:#000080;background-color:#ffffff;">String,</span><span style="background-color:#ffffff;">Remote&gt; </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">aliveServices </span><span style="background-color:#ffffff;">= </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">new</span><span style="background-color:#ffffff;"> HashMap&lt;</span><span style="color:#000080;background-color:#ffffff;">String,</span><span style="background-color:#ffffff;"> Remote&gt;</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 34 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> Map&lt;Remote, </span><span style="color:#000080;background-color:#ffffff;">String&gt;</span><span style="background-color:#ffffff;"> </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">aliveServicesReverseMap </span><span style="background-color:#ffffff;">= </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">new</span><span style="background-color:#ffffff;"> HashMap&lt;Remote, </span><span style="color:#000080;background-color:#ffffff;">String&gt;</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 35 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Random </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">rand </span><span style="background-color:#ffffff;">= </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">new</span><span style="background-color:#ffffff;"> Random</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">System.</span><span style="background-color:#ffffff;font-style:italic;">currentTimeMillis</span><span style="color:#c0c0c0;background-color:#ffffff;font-style:italic;">(</span><span style="color:#c0c0c0;background-color:#ffffff;">))</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 36 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Pattern </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">rmiAddressPattern </span><span style="background-color:#ffffff;">= </span><span style="color:#000080;background-color:#ffffff;">Pattern.</span><span style="background-color:#ffffff;font-style:italic;">compile</span><span style="color:#c0c0c0;background-color:#ffffff;font-style:italic;">(</span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">"rmi://(.+):([0-9]*)/(.+)"</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 37 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Timer </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">timer;
</span><span style="color:#800000;"> 38
 39 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">protected</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">synchronized</span><span style="background-color:#ffffff;"> Remote </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">lookupStub</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throws</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">RemoteLookupFailureException{
</span><span style="color:#800000;"> 40 </span><span style="background-color:#ffffff;">        refreshServicesIfNeededUntilFoundOne</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 41 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">return</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">new</span><span style="background-color:#ffffff;"> ArrayList&lt;Remote&gt;</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">aliveServices.</span><span style="background-color:#ffffff;">values</span><span style="color:#c0c0c0;background-color:#ffffff;">()).</span><span style="background-color:#ffffff;">get</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">rand.</span><span style="background-color:#ffffff;">nextInt</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">aliveServices.</span><span style="background-color:#ffffff;">size</span><span style="color:#c0c0c0;background-color:#ffffff;">()))</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 42 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;"> 43
 44 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">protected</span><span style="background-color:#ffffff;"> Remote </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">getStub</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throws</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">RemoteLookupFailureException{
</span><span style="color:#800000;"> 45 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">return</span><span style="background-color:#ffffff;"> lookupStub</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 46 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;"> 47
 48 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">synchronized</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">refreshServicesIfNeededUntilFoundOne</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;"> 49 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">while</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">aliveServices.</span><span style="background-color:#ffffff;">size</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="background-color:#ffffff;"> == </span><span style="color:#0000ff;background-color:#ffffff;">0</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;"> 50 </span><span style="background-color:#ffffff;">            </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">logger.</span><span style="background-color:#ffffff;">info</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">"No services alive - refreshing endpoints."</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 51 </span><span style="background-color:#ffffff;">            refreshServices</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 52 </span><span style="background-color:#ffffff;">        }
</span><span style="color:#800000;"> 53 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;"> 54
 55 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">refreshServices</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;"> 56 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">for</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">String </span><span style="color:#6e6eb4;background-color:#ffffff;">url:</span><span style="background-color:#ffffff;"> </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">serviceUrls)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;"> 57 </span><span style="background-color:#ffffff;">            </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">if</span><span style="background-color:#ffffff;"> </span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="background-color:#ffffff;">!</span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">aliveServices.</span><span style="background-color:#ffffff;">containsKey</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#6e6eb4;background-color:#ffffff;">url)</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;"> 58 </span><span style="background-color:#ffffff;">                </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">try</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;"> 59 </span><span style="background-color:#ffffff;">                    Remote </span><span style="color:#6e6eb4;background-color:#ffffff;">remote </span><span style="background-color:#ffffff;">= createRemote</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#6e6eb4;background-color:#ffffff;">url)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 60 </span><span style="background-color:#ffffff;">                    addServiceToAlive</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#6e6eb4;background-color:#ffffff;">url,</span><span style="background-color:#ffffff;"> </span><span style="color:#6e6eb4;background-color:#ffffff;">remote)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 61 </span><span style="background-color:#ffffff;">                } </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">catch</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">Exception e)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;"> 62 </span><span style="background-color:#ffffff;">                    </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">logger.</span><span style="background-color:#ffffff;">warn</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">"Can not connect to "</span><span style="background-color:#ffffff;"> + </span><span style="color:#6e6eb4;background-color:#ffffff;">url+</span><span style="background-color:#ffffff;"> </span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">" - ignoring."</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 63 </span><span style="background-color:#ffffff;">                }
</span><span style="color:#800000;"> 64 </span><span style="background-color:#ffffff;">            }
</span><span style="color:#800000;"> 65 </span><span style="background-color:#ffffff;">        }
</span><span style="color:#800000;"> 66 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;"> 67
 68 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> Remote </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">createRemote</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#000080;background-color:#ffffff;">String url)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throws</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">RemoteException,</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">NotBoundException,</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">MalformedURLException{
</span><span style="color:#800000;"> 69 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;">Matcher </span><span style="color:#6e6eb4;background-color:#ffffff;">res </span><span style="background-color:#ffffff;">= </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">rmiAddressPattern.</span><span style="background-color:#ffffff;">matcher</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">url)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 70 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">if</span><span style="background-color:#ffffff;"> </span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="background-color:#ffffff;">!</span><span style="color:#6e6eb4;background-color:#ffffff;">res.</span><span style="background-color:#ffffff;">matches</span><span style="color:#c0c0c0;background-color:#ffffff;">())</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throw</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">new</span><span style="background-color:#ffffff;"> MalformedURLException</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">"Wrong address syntax - '"</span><span style="background-color:#ffffff;"> + </span><span style="color:#000080;background-color:#ffffff;">url </span><span style="background-color:#ffffff;">+</span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">"'. Correct syntax is rmi://host:port/service"</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 71
 72 </span><span style="background-color:#ffffff;">        Registry </span><span style="color:#6e6eb4;background-color:#ffffff;">reg </span><span style="background-color:#ffffff;">= </span><span style="color:#000080;background-color:#ffffff;">LocateRegistry.</span><span style="background-color:#ffffff;font-style:italic;">getRegistry</span><span style="color:#c0c0c0;background-color:#ffffff;font-style:italic;">(</span><span style="color:#6e6eb4;background-color:#ffffff;">res.</span><span style="background-color:#ffffff;">group</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#0000ff;background-color:#ffffff;">1</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;">, </span><span style="color:#000080;background-color:#ffffff;">Integer.</span><span style="background-color:#ffffff;font-style:italic;">valueOf</span><span style="color:#c0c0c0;background-color:#ffffff;font-style:italic;">(</span><span style="color:#6e6eb4;background-color:#ffffff;">res.</span><span style="background-color:#ffffff;">group</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#0000ff;background-color:#ffffff;">2</span><span style="color:#c0c0c0;background-color:#ffffff;">)))</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 73 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">return</span><span style="background-color:#ffffff;"> </span><span style="color:#6e6eb4;background-color:#ffffff;">reg.</span><span style="background-color:#ffffff;">lookup</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#6e6eb4;background-color:#ffffff;">res.</span><span style="background-color:#ffffff;">group</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#0000ff;background-color:#ffffff;">3</span><span style="color:#c0c0c0;background-color:#ffffff;">))</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 74 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;"> 75
 76 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Object </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">invoke</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">final</span><span style="background-color:#ffffff;"> MethodInvocation </span><span style="color:#000080;background-color:#ffffff;">invocation)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throws</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Throwable{
</span><span style="color:#800000;"> 77 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">return</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">ErrorUtils.</span><span style="background-color:#ffffff;font-style:italic;">executeWithRetry</span><span style="color:#c0c0c0;background-color:#ffffff;font-style:italic;">(</span><span style="color:#0000ff;background-color:#ffffff;">100</span><span style="background-color:#ffffff;">, </span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">"Invocation failed - retrying..."</span><span style="background-color:#ffffff;">, </span><span style="color:#0000ff;background-color:#ffffff;">5000</span><span style="background-color:#ffffff;">, </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">new</span><span style="background-color:#ffffff;"> ErrorUtils</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">CallableWithRecovery</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;"> 78 </span><span style="background-color:#ffffff;">            </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> Remote </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">stub;
</span><span style="color:#800000;"> 79 </span><span style="background-color:#ffffff;">            </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">recover</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throws</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Throwable{
</span><span style="color:#800000;"> 80 </span><span style="background-color:#ffffff;">                removeServiceFromAlive</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">stub)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 81 </span><span style="background-color:#ffffff;">            }
</span><span style="color:#800000;"> 82
 83 </span><span style="background-color:#ffffff;">            </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Object </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">call</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throws</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Throwable{
</span><span style="color:#800000;"> 84 </span><span style="background-color:#ffffff;">                refreshServicesIfNeededUntilFoundOne</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 85 </span><span style="background-color:#ffffff;">                </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">stub </span><span style="background-color:#ffffff;">= getStub</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 86 </span><span style="background-color:#ffffff;">                </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">return</span><span style="background-color:#ffffff;"> doInvoke</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">invocation,</span><span style="background-color:#ffffff;"> </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">stub)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 87 </span><span style="background-color:#ffffff;">            }
</span><span style="color:#800000;"> 88 </span><span style="background-color:#ffffff;">        }, </span><span style="color:#000080;background-color:#ffffff;">RemoteAccessException.</span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">class</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 89 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;"> 90
 91 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">synchronized</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">addServiceToAlive</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#000080;background-color:#ffffff;">String url,</span><span style="background-color:#ffffff;"> Remote </span><span style="color:#000080;background-color:#ffffff;">remote)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;"> 92 </span><span style="background-color:#ffffff;">        </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">aliveServices.</span><span style="background-color:#ffffff;">put</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">url,</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">remote)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 93 </span><span style="background-color:#ffffff;">        </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">aliveServicesReverseMap.</span><span style="background-color:#ffffff;">put</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">remote,</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">url)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 94 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;"> 95
 96 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">synchronized</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">removeServiceFromAlive</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="background-color:#ffffff;">Remote </span><span style="color:#000080;background-color:#ffffff;">s)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;"> 97 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;">String </span><span style="color:#6e6eb4;background-color:#ffffff;">url </span><span style="background-color:#ffffff;">= </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">aliveServicesReverseMap.</span><span style="background-color:#ffffff;">remove</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">s)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 98 </span><span style="background-color:#ffffff;">        </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">aliveServices.</span><span style="background-color:#ffffff;">remove</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#6e6eb4;background-color:#ffffff;">url)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 99 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;">100
101 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">setServiceUrls</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="background-color:#ffffff;">List&lt;</span><span style="color:#000080;background-color:#ffffff;">String&gt;</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">serviceUrls)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">102 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">this</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">serviceUrls </span><span style="background-color:#ffffff;">= </span><span style="color:#000080;background-color:#ffffff;">serviceUrls;
</span><span style="color:#800000;">103 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;">104
105 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">afterPropertiesSet</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">106 </span><span style="background-color:#ffffff;">        setRefreshStubOnConnectFailure</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">false</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">107 </span><span style="background-color:#ffffff;">        setCacheStub</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">false</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">108 </span><span style="background-color:#ffffff;">        setServiceUrl</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">"legacy"</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">109 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">super</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">afterPropertiesSet</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">110
111 </span><span style="background-color:#ffffff;">        initRefreshTimer</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">112 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;">113
114 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">initRefreshTimer</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">115 </span><span style="background-color:#ffffff;">        </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">timer </span><span style="background-color:#ffffff;">= </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">new</span><span style="background-color:#ffffff;"> Timer</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">116 </span><span style="background-color:#ffffff;">        </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">timer.</span><span style="background-color:#ffffff;">schedule</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">new</span><span style="background-color:#ffffff;"> TimerTask</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">117 </span><span style="background-color:#ffffff;">            </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">run</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">118 </span><span style="background-color:#ffffff;">                </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">try</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">119 </span><span style="background-color:#ffffff;">                    refreshServices</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">120 </span><span style="background-color:#ffffff;">                } </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">catch</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">Exception e)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">121 </span><span style="background-color:#ffffff;">                    </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">logger.</span><span style="background-color:#ffffff;">warn</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">"Can not refresh services"</span><span style="background-color:#ffffff;">, </span><span style="color:#000080;background-color:#ffffff;">e)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">122 </span><span style="background-color:#ffffff;">                }
</span><span style="color:#800000;">123 </span><span style="background-color:#ffffff;">            }
</span><span style="color:#800000;">124 </span><span style="background-color:#ffffff;">        }, </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">refreshEndpointsMillis,</span><span style="background-color:#ffffff;"> </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">refreshEndpointsMillis)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">125 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;">126
127 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">destroy</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throws</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Exception{
</span><span style="color:#800000;">128 </span><span style="background-color:#ffffff;">        </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">timer.</span><span style="background-color:#ffffff;">cancel</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">129 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;">130
131 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">setRefreshEndpointsMillis</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">int</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">refreshEndpointsMillis)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">132 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">this</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;">refreshEndpointsMillis </span><span style="background-color:#ffffff;">= </span><span style="color:#000080;background-color:#ffffff;">refreshEndpointsMillis;
</span><span style="color:#800000;">133 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;">134 </span><span style="background-color:#ffffff;">}</span></pre>
<p>Here is ErrorUtils:</p>
<pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-color:#000000;border-style:solid;border-width:0.01mm;padding:4px;"><span style="color:#800000;"> 1 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">package</span><span style="background-color:#ffffff;"> org</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">javaexpert</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">error</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 2
 3 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> java</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">util</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">Set</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;"> 4
 5
 6 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.util.Arrays;
</span><span style="color:#800000;"> 7 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.util.HashSet;
</span><span style="color:#800000;"> 8 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">import</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">java.util.logging.Logger;
</span><span style="color:#800000;"> 9
10
11 </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">class</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">ErrorUtils </span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">12 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">static</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">final</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Logger </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;">LOGGER </span><span style="background-color:#ffffff;">= </span><span style="color:#000080;background-color:#ffffff;">Logger.</span><span style="background-color:#ffffff;font-style:italic;">getLogger</span><span style="color:#c0c0c0;background-color:#ffffff;font-style:italic;">(</span><span style="color:#000080;background-color:#ffffff;">ErrorUtils.</span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">class</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">getCanonicalName</span><span style="color:#c0c0c0;background-color:#ffffff;">())</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">13
14 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">static</span><span style="background-color:#ffffff;"> &lt;T&gt; T </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">executeWithRetry</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">int</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#ffcc00;"><span style="color:#000080;background-color:#ffffff;">retryCount,</span></span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">String errorMessage,</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">int</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">sleepMillis,</span><span style="background-color:#ffffff;"> Callable&lt;T&gt; </span><span style="color:#000080;background-color:#ffffff;">callable,</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Class...</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">dontIgnoreExceptions)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throws</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Throwable </span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">15 </span><span style="background-color:#ffffff;">        Set </span><span style="color:#6e6eb4;background-color:#ffffff;">dontIgnoreSet </span><span style="background-color:#ffffff;">= </span><span style="background-color:#ffffff;font-style:italic;">convertToSet</span><span style="color:#c0c0c0;background-color:#ffffff;font-style:italic;">(</span><span style="color:#000080;background-color:#ffffff;">dontIgnoreExceptions)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">16 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;">Throwable </span><span style="color:#6e6eb4;background-color:#ffffff;">lastException </span><span style="background-color:#ffffff;">= </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">null</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">17 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">while</span><span style="background-color:#ffffff;"> </span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="text-decoration:underline;color:#ffcc00;"><span style="color:#000080;background-color:#ffffff;">retryCount--</span></span><span style="background-color:#ffffff;"> &gt; </span><span style="color:#0000ff;background-color:#ffffff;">0</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;"> {
</span><span style="color:#800000;">18 </span><span style="background-color:#ffffff;">            </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">try</span><span style="background-color:#ffffff;"> {
</span><span style="color:#800000;">19 </span><span style="background-color:#ffffff;">                </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">return</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">callable.</span><span style="background-color:#ffffff;">call</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">20 </span><span style="background-color:#ffffff;">            } </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">catch</span><span style="background-color:#ffffff;"> </span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">Throwable e)</span><span style="background-color:#ffffff;"> {
</span><span style="color:#800000;">21 </span><span style="background-color:#ffffff;">                </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">if</span><span style="background-color:#ffffff;"> </span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="background-color:#ffffff;">!</span><span style="color:#6e6eb4;background-color:#ffffff;">dontIgnoreSet.</span><span style="background-color:#ffffff;">isEmpty</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="background-color:#ffffff;"> &amp;&amp; !</span><span style="background-color:#ffffff;font-style:italic;">contains</span><span style="color:#c0c0c0;background-color:#ffffff;font-style:italic;">(</span><span style="color:#6e6eb4;background-color:#ffffff;">dontIgnoreSet,</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">e)</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throw</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">e;
</span><span style="color:#800000;">22 </span><span style="background-color:#ffffff;">                </span><span style="color:#6e6eb4;background-color:#ffffff;">lastException </span><span style="background-color:#ffffff;">= </span><span style="color:#000080;background-color:#ffffff;">e;
</span><span style="color:#800000;">23 </span><span style="background-color:#ffffff;">                </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;">LOGGER.</span><span style="background-color:#ffffff;">warning</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">errorMessage </span><span style="background-color:#ffffff;">+ </span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">" Cause: "</span><span style="background-color:#ffffff;"> + </span><span style="color:#000080;background-color:#ffffff;">e.</span><span style="background-color:#ffffff;">getMessage</span><span style="color:#c0c0c0;background-color:#ffffff;">())</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">24 </span><span style="background-color:#ffffff;">                </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;">LOGGER.</span><span style="background-color:#ffffff;">info</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">"Sleeping for "</span><span style="background-color:#ffffff;"> + </span><span style="color:#000080;background-color:#ffffff;">sleepMillis </span><span style="background-color:#ffffff;">+ </span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">" millis"</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">25 </span><span style="background-color:#ffffff;">                </span><span style="background-color:#ffffff;font-style:italic;">sleep</span><span style="color:#c0c0c0;background-color:#ffffff;font-style:italic;">(</span><span style="color:#000080;background-color:#ffffff;">sleepMillis)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">26 </span><span style="background-color:#ffffff;">                </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;">LOGGER.</span><span style="background-color:#ffffff;">info</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">"Retrying..."</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">27 </span><span style="background-color:#ffffff;">                </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">if</span><span style="background-color:#ffffff;"> </span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">callable </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">instanceof</span><span style="background-color:#ffffff;"> CallableWithRecovery</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;"> {
</span><span style="color:#800000;">28 </span><span style="background-color:#ffffff;">                    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">try</span><span style="background-color:#ffffff;"> {
</span><span style="color:#800000;">29 </span><span style="background-color:#ffffff;">                        </span><span style="color:#c0c0c0;background-color:#ffffff;">((</span><span style="background-color:#ffffff;">CallableWithRecovery</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">callable)</span><span style="color:#c0c0c0;background-color:#ffffff;">.</span><span style="background-color:#ffffff;">recover</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">30 </span><span style="background-color:#ffffff;">                    } </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">catch</span><span style="background-color:#ffffff;"> </span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">Throwable throwable)</span><span style="background-color:#ffffff;"> {
</span><span style="color:#800000;">31 </span><span style="background-color:#ffffff;">                        </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;">LOGGER.</span><span style="background-color:#ffffff;">warning</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">"Recovery action failed."</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">32 </span><span style="background-color:#ffffff;">                    }
</span><span style="color:#800000;">33 </span><span style="background-color:#ffffff;">                }
</span><span style="color:#800000;">34 </span><span style="background-color:#ffffff;">            }
</span><span style="color:#800000;">35 </span><span style="background-color:#ffffff;">        }
</span><span style="color:#800000;">36 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throw</span><span style="background-color:#ffffff;"> </span><span style="color:#6e6eb4;background-color:#ffffff;">lastException;
</span><span style="color:#800000;">37 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;">38
39 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">static</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">boolean</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">contains</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="background-color:#ffffff;">Set&lt;</span><span style="color:#000080;background-color:#ffffff;">Class&gt;</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">dontIgnoreSet,</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Throwable e)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">40 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">for</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">Class </span><span style="color:#6e6eb4;background-color:#ffffff;">c:</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">dontIgnoreSet)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">41 </span><span style="background-color:#ffffff;">            </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">if</span><span style="background-color:#ffffff;"> </span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#6e6eb4;background-color:#ffffff;">c.</span><span style="background-color:#ffffff;">isInstance</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">e)</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">return</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">true</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">42 </span><span style="background-color:#ffffff;">        }
</span><span style="color:#800000;">43 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">return</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">false</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">44
45 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;">46
47 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">static</span><span style="background-color:#ffffff;"> Set </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">convertToSet</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#000080;background-color:#ffffff;">Object...</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">objects)</span><span style="background-color:#ffffff;">{
</span><span style="color:#800000;">48 </span><span style="background-color:#ffffff;">        Set </span><span style="color:#6e6eb4;background-color:#ffffff;">res </span><span style="background-color:#ffffff;">= </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">new</span><span style="background-color:#ffffff;"> HashSet</span><span style="color:#c0c0c0;background-color:#ffffff;">()</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">49 </span><span style="background-color:#ffffff;">        </span><span style="color:#6e6eb4;background-color:#ffffff;">res.</span><span style="background-color:#ffffff;">addAll</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">Arrays.</span><span style="background-color:#ffffff;font-style:italic;">asList</span><span style="color:#c0c0c0;background-color:#ffffff;font-style:italic;">(</span><span style="color:#000080;background-color:#ffffff;">objects)</span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">50 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">return</span><span style="background-color:#ffffff;"> </span><span style="color:#6e6eb4;background-color:#ffffff;">res;
</span><span style="color:#800000;">51 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;">52
53 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">private</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">static</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">sleep</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">int</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">sleepMillis)</span><span style="background-color:#ffffff;"> {
</span><span style="color:#800000;">54 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">try</span><span style="background-color:#ffffff;"> {
</span><span style="color:#800000;">55 </span><span style="background-color:#ffffff;">            </span><span style="color:#000080;background-color:#ffffff;">Thread.</span><span style="background-color:#ffffff;font-style:italic;">sleep</span><span style="color:#c0c0c0;background-color:#ffffff;font-style:italic;">(</span><span style="color:#000080;background-color:#ffffff;">sleepMillis)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">56 </span><span style="background-color:#ffffff;">        } </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">catch</span><span style="background-color:#ffffff;"> </span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">InterruptedException e1)</span><span style="background-color:#ffffff;"> {
</span><span style="color:#800000;">57 </span><span style="background-color:#ffffff;">            </span><span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;">LOGGER.</span><span style="background-color:#ffffff;">severe</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#008000;background-color:#ffffff;font-weight:bold;">"Interrupted"</span><span style="background-color:#ffffff;">+ </span><span style="color:#000080;background-color:#ffffff;">e1)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">58 </span><span style="background-color:#ffffff;">            </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throw</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">new</span><span style="background-color:#ffffff;"> RuntimeException</span><span style="color:#c0c0c0;background-color:#ffffff;">(</span><span style="color:#000080;background-color:#ffffff;">e1)</span><span style="color:#808080;background-color:#ffffff;">;
</span><span style="color:#800000;">59 </span><span style="background-color:#ffffff;">        }
</span><span style="color:#800000;">60 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;">61
62 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">interface</span><span style="background-color:#ffffff;"> Callable&lt;T&gt; {
</span><span style="color:#800000;">63 </span><span style="background-color:#ffffff;">        T </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">call</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throws</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Throwable;
</span><span style="color:#800000;">64 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;">65
66 </span><span style="background-color:#ffffff;">    </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">public</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">interface</span><span style="background-color:#ffffff;"> CallableWithRecovery </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">extends</span><span style="background-color:#ffffff;"> Callable {
</span><span style="color:#800000;">67 </span><span style="background-color:#ffffff;">        </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">void</span><span style="background-color:#ffffff;"> </span><span style="text-decoration:underline;color:#000000;"><span style="background-color:#ffffff;font-weight:bold;">recover</span></span><span style="text-decoration:underline;color:#000000;"><span style="color:#c0c0c0;background-color:#ffffff;font-weight:bold;">(</span></span><span style="color:#c0c0c0;background-color:#ffffff;">)</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;font-weight:bold;">throws</span><span style="background-color:#ffffff;"> </span><span style="color:#000080;background-color:#ffffff;">Throwable;
</span><span style="color:#800000;">68 </span><span style="background-color:#ffffff;">    }
</span><span style="color:#800000;">69 </span><span style="background-color:#ffffff;">}</span></pre>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/piotrga.wordpress.com/21/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/piotrga.wordpress.com/21/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/piotrga.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/piotrga.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/piotrga.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/piotrga.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/piotrga.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/piotrga.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/piotrga.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/piotrga.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/piotrga.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/piotrga.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=piotrga.wordpress.com&blog=595023&post=21&subd=piotrga&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://piotrga.wordpress.com/2007/08/22/rmicluster-working-alternative-for-cluster4spring/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d9b2bf89a10d0dfd765c2e95e8435bd8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr Gabryanczyk</media:title>
		</media:content>
	</item>
		<item>
		<title>What makes a good Software Engineer?</title>
		<link>http://piotrga.wordpress.com/2007/03/25/what-makes-a-good-software-engineer/</link>
		<comments>http://piotrga.wordpress.com/2007/03/25/what-makes-a-good-software-engineer/#comments</comments>
		<pubDate>Sun, 25 Mar 2007 20:02:54 +0000</pubDate>
		<dc:creator>Piotr Gabryanczyk</dc:creator>
				<category><![CDATA[algorithmics]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://piotrga.wordpress.com/2007/03/25/what-makes-a-good-software-engineer/</guid>
		<description><![CDATA[Algorithms
I recently came across Cedric Beust&#8217;s post about new book &#8220;Algorithms&#8220;, by Sanjoy Dasgupta, Christos Papadimitriou and Umesh Vazirani. It is a good book, but I wanted to write about something else.
Algorithmics vs Design skills
Cedric&#8217;s post started a discussion on what is more important, knowledge of algorithms or good software design. One of the comments [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=piotrga.wordpress.com&blog=595023&post=15&subd=piotrga&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h2>Algorithms</h2>
<p>I recently came across Cedric Beust&#8217;s <a href="http://beust.com/weblog/archives/000425.html">post</a> about new book &#8220;<em>Algorithms</em>&#8220;, by Sanjoy Dasgupta, Christos Papadimitriou and Umesh Vazirani. It is a good book, but I wanted to write about something else.</p>
<h2>Algorithmics vs Design skills</h2>
<p>Cedric&#8217;s post started a discussion on what is more important, knowledge of algorithms or good software design. One of the comments by Chris Johnston says:<br />
&#8220;&#8230;When I was taking my CompSci degree, the first thing the prof said to us in my first comp sci course was that we were not there to study programming; we where there to study algorithms&#8230;&#8221;</p>
<p>I have seen this approach at my uni as well. For some time I was even proud of it. This made me feel better then &#8220;the rest of the crowd&#8221; who learn VB and think they are qualified. Unfortunately it turned out in &#8220;real live&#8221; that my algorithmic knowledge hasn&#8217;t been used much. And thing I was lacking a lot was good design principles, which I was never taught at uni as my professors where so focused on making me a scientist rather then good software engineer. In the world of complex software systems it is often much more important to create APIs and programs which are simple to understand and modify or maintain. </p>
<p>Please do not think that I underestimate algorithmic skills. I believe it is essential that developers have strong algorithmic background, but you can never forget that it is not the only thing which makes a good developer.</p>
<h3>What do YOU think makes a good developer?</h3>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/piotrga.wordpress.com/15/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/piotrga.wordpress.com/15/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/piotrga.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/piotrga.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/piotrga.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/piotrga.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/piotrga.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/piotrga.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/piotrga.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/piotrga.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/piotrga.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/piotrga.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=piotrga.wordpress.com&blog=595023&post=15&subd=piotrga&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://piotrga.wordpress.com/2007/03/25/what-makes-a-good-software-engineer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d9b2bf89a10d0dfd765c2e95e8435bd8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr Gabryanczyk</media:title>
		</media:content>
	</item>
	</channel>
</rss>