<?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/"
	>

<channel>
	<title>IONCANNON &#187; java</title>
	<atom:link href="http://www.ioncannon.net/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ioncannon.net</link>
	<description>Thoughts on Software Development and Engineering</description>
	<lastBuildDate>Tue, 03 Jan 2012 13:59:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
	<atom:link rel='hub' href='http://www.ioncannon.net/?pushpress=hub'/>
		<item>
		<title>PowerDNS Makes Custom DNS Backends Easy</title>
		<link>http://www.ioncannon.net/system-administration/135/powerdns-custom-dns-backend/</link>
		<comments>http://www.ioncannon.net/system-administration/135/powerdns-custom-dns-backend/#comments</comments>
		<pubDate>Sun, 14 Sep 2008 22:55:41 +0000</pubDate>
		<dc:creator>carson</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[system administration]]></category>
		<category><![CDATA[utilities]]></category>

		<guid isPermaLink="false">http://www.ioncannon.net/?p=135</guid>
		<description><![CDATA[I ran into PowerDNS recently when I needed to find a DNS server that would allow me to produce custom responses to domain queries. I needed to have a request for a DNS entry return a different IP depending on some factors in a database and I needed that data to always be accurate (not [...]]]></description>
			<content:encoded><![CDATA[<p>I ran into <a href="http://www.powerdns.com/">PowerDNS</a> recently when I needed to find a DNS server that would allow me to produce custom responses to domain queries. I needed to have a request for a DNS entry return a different IP depending on some factors in a database and I needed that data to always be accurate (not cached locally). I found that PowerDNS allows for a lot of customization and I ended up using its <a href="http://doc.powerdns.com/pipebackend-dynamic-resolution.html">piped backend for dynamic queries</a> feature.</p>
<p>With this level of customization you can do things like write your own <a href="http://en.wikipedia.org/wiki/DNS_Blacklist">DNS black list</a>, track who is making DNS requests, give out IP addresses based on a servers availability or use geographic information to return a different IP.</p>
<p><span id="more-135"></span></p>
<p>The following is an overview of how to set up your own PowerDNS piped backend process. To start out it may help to read the <a href="http://doc.powerdns.com/backends-detail.html">overview of the PowerDNS backend</a>. </p>
<p>Here is an example program that is run directly by PowerDNS using pipes:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">import</span> <span class="co2">java.io.BufferedReader</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.io.InputStreamReader</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.io.IOException</span><span class="sy0">;</span></p>
<p><span class="kw1">public</span> <span class="kw1">class</span> PowerDNSPipeTest<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedReader</span></a> reader <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedReader</span></a><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainputstreamreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">InputStreamReader</span></a><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">in</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; readIntro<span class="br0">&#40;</span>reader<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> line<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>line <span class="sy0">=</span> reader.<span class="me1">readLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; processLine<span class="br0">&#40;</span>line<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw4">void</span> processLine<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> line<span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> values<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> line.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\t</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>values.<span class="me1">length</span> <span class="sy0">==</span> <span class="nu0">6</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="co1">// Testing any a response to the ANY or A record request</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="st0">&quot;ANY&quot;</span>.<span class="me1">equalsIgnoreCase</span><span class="br0">&#40;</span>values<span class="br0">&#91;</span>3<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="st0">&quot;A&quot;</span>.<span class="me1">equalsIgnoreCase</span><span class="br0">&#40;</span>values<span class="br0">&#91;</span>3<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;DATA<span class="es0">\t</span>&quot;</span> <span class="sy0">+</span> values<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="st0">&quot;<span class="es0">\t</span>IN<span class="es0">\t</span>A<span class="es0">\t</span>0<span class="es0">\t</span>1800<span class="es0">\t</span>127.0.0.5&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;LOG<span class="es0">\t</span>PowerDNS sent unpareable string&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;FAIL&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;END&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">flush</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw4">void</span> readIntro<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedReader</span></a> reader<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> line <span class="sy0">=</span> reader.<span class="me1">readLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>line <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> values<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> line.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\t</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>values.<span class="me1">length</span> <span class="sy0">==</span> <span class="nu0">2</span> <span class="sy0">&amp;&amp;</span> <span class="st0">&quot;HELO&quot;</span>.<span class="me1">equals</span><span class="br0">&#40;</span>values<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="st0">&quot;1&quot;</span>.<span class="me1">equals</span><span class="br0">&#40;</span>values<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;OK<span class="es0">\t</span>Backend starting&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;FAIL&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">flush</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="sy0">-</span>1<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>I found that for some reason PowerDNS didn&#039;t want to run the java command directly so I copied that class to /tmp and wrapped the command in a small shell script like this to see if that would fix the problem:</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;"><span class="co0">#!/bin/sh</span><br />
<span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>java<span class="sy0">/</span>bin<span class="sy0">/</span>java <span class="re5">-cp</span> <span class="sy0">/</span>tmp<span class="sy0">/</span> PowerDNSPipeTest</div>
</div>
<p>In the configuration file I then added:</p>
<div class="codesnip-container" >
<div class="text codesnip" style="font-family:monospace;">launch=pipe<br />
pipe-command=/tmp/powerdns.sh</div>
</div>
<p>This works fine but PowerDNS spawns multiple backend processes to run the piped application and with java that seemed like a bad idea since it would create an entire JVM instance each time. So I decided to modify their sample perl program to send the requests to a long running java background process that would then just use threads.</p>
<div class="codesnip-container" >
<div class="perl codesnip" style="font-family:monospace;"><span class="co1">#!/usr/bin/perl -w</span></p>
<p><span class="kw2">use</span> strict<span class="sy0">;</span></p>
<p><span class="co5">$|</span><span class="sy0">=</span><span class="nu0">1</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># no buffering</span></p>
<p><span class="kw1">my</span> <span class="re0">$line</span><span class="sy0">=&lt;&gt;;</span><br />
<a href="http://perldoc.perl.org/functions/chomp.html"><span class="kw3">chomp</span></a><span class="br0">&#40;</span><span class="re0">$line</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw1">unless</span><span class="br0">&#40;</span><span class="re0">$line</span> <span class="kw1">eq</span> <span class="st0">&quot;HELO<span class="es0">\t</span>1&quot;</span><span class="br0">&#41;</span> <br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;FAIL<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="kw2">STDERR</span> <span class="st0">&quot;Recevied &#039;$line&#039;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;&gt;;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/exit.html"><span class="kw3">exit</span></a><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;OK &nbsp; &nbsp; &nbsp; Sample backend firing up<span class="es0">\n</span>&quot;</span><span class="sy0">;</span> &nbsp; &nbsp;<span class="co1"># print our banner</span></p>
<p><span class="kw1">while</span><span class="br0">&#40;</span><span class="sy0">&lt;&gt;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="kw2">STDERR</span> <span class="st0">&quot;$$ Received: $_<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/chomp.html"><span class="kw3">chomp</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">@arr</span><span class="sy0">=</span><a href="http://perldoc.perl.org/functions/split.html"><span class="kw3">split</span></a><span class="br0">&#40;</span><span class="co2">/\t/</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">@arr</span><span class="sy0">&lt;</span>6<span class="br0">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;LOG &nbsp; &nbsp; &nbsp;PowerDNS sent unparseable line<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;FAIL<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">next</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="kw2">STDERR</span> <span class="st0">&quot;$$ Sent A records<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="re0">&amp;sendRequest</span><span class="br0">&#40;</span><span class="co5">$_</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="kw2">STDERR</span> <span class="st0">&quot;$$ End of data<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;END<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">sub</span> sendRequest <br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw2">use</span> Socket<span class="sy0">;</span><br />
&nbsp; <span class="kw1">my</span><span class="br0">&#40;</span><span class="re0">$sockaddr</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">,</span> <span class="re0">$that</span><span class="sy0">,</span> <span class="re0">$thataddr</span><span class="sy0">,</span> <span class="re0">$thisaddr</span><span class="sy0">,</span> <span class="re0">$remote</span><span class="sy0">,</span> <span class="re0">$port</span><span class="sy0">,</span> <span class="re0">$iaddr</span><span class="sy0">,</span> <span class="re0">$paddr</span><span class="sy0">,</span> <span class="re0">$proto</span><span class="sy0">,</span> <span class="re0">$line</span><span class="sy0">,</span> <span class="re0">@output</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="re0">$remote</span> <span class="sy0">=</span> <span class="st0">&quot;127.0.0.1&quot;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$port</span> <span class="sy0">=</span> <span class="nu0">4444</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$sockaddr</span> <span class="sy0">=</span> <span class="st_h">&#039;S n a4 x8&#039;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$port</span> <span class="sy0">=~</span> <span class="co2">/\D/</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="re0">$port</span> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/getservbyname.html"><span class="kw3">getservbyname</span></a><span class="br0">&#40;</span><span class="re0">$port</span><span class="sy0">,</span> <span class="st_h">&#039;tcp&#039;</span><span class="br0">&#41;</span> <span class="br0">&#125;</span><br />
&nbsp; <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st0">&quot;No port&quot;</span> <span class="kw1">unless</span> <span class="re0">$port</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$thisaddr</span> &nbsp; <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/gethostbyname.html"><span class="kw3">gethostbyname</span></a><span class="br0">&#40;</span><span class="st0">&quot;localhost&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$thataddr</span> &nbsp; <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/gethostbyname.html"><span class="kw3">gethostbyname</span></a><span class="br0">&#40;</span><span class="re0">$remote</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$this</span> &nbsp; <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/pack.html"><span class="kw3">pack</span></a><span class="br0">&#40;</span><span class="re0">$sockaddr</span><span class="sy0">,</span> AF_INET<span class="sy0">,</span> 0<span class="sy0">,</span> <span class="re0">$thisaddr</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$that</span> &nbsp; <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/pack.html"><span class="kw3">pack</span></a><span class="br0">&#40;</span><span class="re0">$sockaddr</span><span class="sy0">,</span> AF_INET<span class="sy0">,</span> <span class="re0">$port</span><span class="sy0">,</span> <span class="re0">$thataddr</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="re0">$proto</span> &nbsp; <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/getprotobyname.html"><span class="kw3">getprotobyname</span></a><span class="br0">&#40;</span><span class="st_h">&#039;tcp&#039;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <a href="http://perldoc.perl.org/functions/socket.html"><span class="kw3">socket</span></a><span class="br0">&#40;</span>SOCK<span class="sy0">,</span> PF_INET<span class="sy0">,</span> SOCK_STREAM<span class="sy0">,</span> <span class="re0">$proto</span><span class="br0">&#41;</span> &nbsp;<span class="sy0">||</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st0">&quot;socket: $!&quot;</span><span class="sy0">;</span><br />
&nbsp; <a href="http://perldoc.perl.org/functions/bind.html"><span class="kw3">bind</span></a><span class="br0">&#40;</span>SOCK<span class="sy0">,</span> <span class="re0">$this</span><span class="br0">&#41;</span> &nbsp; &nbsp;<span class="sy0">||</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st0">&quot;bind: $!&quot;</span><span class="sy0">;</span><br />
&nbsp; <a href="http://perldoc.perl.org/functions/connect.html"><span class="kw3">connect</span></a><span class="br0">&#40;</span>SOCK<span class="sy0">,</span> <span class="re0">$that</span><span class="br0">&#41;</span> &nbsp; &nbsp;<span class="sy0">||</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st0">&quot;connect: $!&quot;</span><span class="sy0">;</span><br />
&nbsp; <a href="http://perldoc.perl.org/functions/select.html"><span class="kw3">select</span></a><span class="br0">&#40;</span>SOCK<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co5">$|</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span> <a href="http://perldoc.perl.org/functions/select.html"><span class="kw3">select</span></a><span class="br0">&#40;</span><span class="kw2">STDOUT</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> SOCK <span class="co5">@_</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">@output</span> <span class="sy0">=</span> <span class="re4">&lt;SOCK&gt;</span><span class="sy0">;</span></p>
<p>&nbsp; <a href="http://perldoc.perl.org/functions/close.html"><span class="kw3">close</span></a> <span class="br0">&#40;</span>SOCK<span class="br0">&#41;</span> <span class="sy0">||</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st0">&quot;close: $!&quot;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">@output</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Here is the code for the threaded java server modified from the above pipe example:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">import</span> <span class="co2">java.net.ServerSocket</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.net.Socket</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.io.*</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.util.concurrent.PriorityBlockingQueue</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.util.concurrent.ThreadPoolExecutor</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.util.concurrent.TimeUnit</span><span class="sy0">;</span></p>
<p><span class="kw1">public</span> <span class="kw1">class</span> PowerDNSServerTest<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; PriorityBlockingQueue<span class="sy0">&lt;</span>Runnable<span class="sy0">&gt;</span> queue <span class="sy0">=</span> <span class="kw1">new</span> PriorityBlockingQueue<span class="sy0">&lt;</span>Runnable<span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; ThreadPoolExecutor threadPool <span class="sy0">=</span> <span class="kw1">new</span> ThreadPoolExecutor<span class="br0">&#40;</span>5, 30, 30, TimeUnit.<span class="me1">SECONDS</span>, queue<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a> serverSocket <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a><span class="br0">&#40;</span>4444<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; threadPool.<span class="me1">execute</span><span class="br0">&#40;</span><span class="kw1">new</span> PowerDNSServerClientThread<span class="br0">&#40;</span>serverSocket.<span class="me1">accept</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">class</span> PowerDNSServerClientThread <span class="kw1">implements</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arunnable+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Runnable</span></a><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> clientSocket<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> PowerDNSServerClientThread<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> clientSocket<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">clientSocket</span> <span class="sy0">=</span> clientSocket<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedReader</span></a> input <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedReader</span></a><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainputstreamreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">InputStreamReader</span></a><span class="br0">&#40;</span>clientSocket.<span class="me1">getInputStream</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedwriter+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedWriter</span></a> output <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedwriter+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedWriter</span></a><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aoutputstreamwriter+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">OutputStreamWriter</span></a><span class="br0">&#40;</span>clientSocket.<span class="me1">getOutputStream</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> command <span class="sy0">=</span> input.<span class="me1">readLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">err</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;[&quot;</span> <span class="sy0">+</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Athread+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Thread</span></a>.<span class="me1">currentThread</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;] Received: &quot;</span> <span class="sy0">+</span> command<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> values<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> command.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\t</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>values.<span class="me1">length</span> <span class="sy0">==</span> <span class="nu0">6</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Testing any a response to the ANY or A record request</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="st0">&quot;ANY&quot;</span>.<span class="me1">equalsIgnoreCase</span><span class="br0">&#40;</span>values<span class="br0">&#91;</span>3<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="st0">&quot;A&quot;</span>.<span class="me1">equalsIgnoreCase</span><span class="br0">&#40;</span>values<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output.<span class="me1">write</span><span class="br0">&#40;</span><span class="st0">&quot;DATA<span class="es0">\t</span>&quot;</span> <span class="sy0">+</span> values<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="st0">&quot;<span class="es0">\t</span>IN<span class="es0">\t</span>A<span class="es0">\t</span>0<span class="es0">\t</span>1800<span class="es0">\t</span>127.0.0.5<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output.<span class="me1">write</span><span class="br0">&#40;</span><span class="st0">&quot;LOG<span class="es0">\t</span>PowerDNS sent unpareable string<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output.<span class="me1">write</span><span class="br0">&#40;</span><span class="st0">&quot;FAIL<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; output.<span class="me1">write</span><span class="br0">&#40;</span><span class="st0">&quot;END<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; output.<span class="me1">flush</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; output.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; input.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; clientSocket.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>In the config file I replaced the above entries with:</p>
<div class="codesnip-container" >
<div class="text codesnip" style="font-family:monospace;">launch=pipe<br />
pipe-command=/tmp/powerdns.pl</div>
</div>
<p>That is all there is to it. So far this is the easiest way I have found of passing requests on to an application. The configuration for PowerDNS also allows you to force a request to the backend with every query eliminating the internal cache. For me that was a needed feature since every request could potentially change from second to second and the latest IP would need to be given out. I found that there are a lot of options for small tweaks like this that are probably on the fringe of what 99% of users need but are very handy to be able to change when you need to change them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ioncannon.net/system-administration/135/powerdns-custom-dns-backend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spiffing up JFreeChart charts</title>
		<link>http://www.ioncannon.net/java/139/spiffing-up-jfreechart-charts/</link>
		<comments>http://www.ioncannon.net/java/139/spiffing-up-jfreechart-charts/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 17:52:36 +0000</pubDate>
		<dc:creator>carson</dc:creator>
				<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.ioncannon.net/?p=139</guid>
		<description><![CDATA[I recently was given a copy of ChartFX for Java to evaluate as a charting solution for a Java project. After using it for a while it seemed nice despite having some odd ways of doing things that I think come from it originally being a C# and VB product. After playing with it for [...]]]></description>
			<content:encoded><![CDATA[<p>I recently was given a copy of <a href="http://www.softwarefx.com/SFXJavaProducts/CFXforJava/">ChartFX for Java</a> to evaluate as a charting solution for a Java project. After using it for a while it seemed nice despite having some odd ways of doing things that I think come from it originally being a C# and VB product. After playing with it for a while I decided to see if I could get <a href="http://www.jfree.org/jfreechart/">JFreeChart</a> charts to look the same way. As it turns out it wasn&#039;t that hard.</p>
<p><span id="more-139"></span></p>
<p>There isn&#039;t much difference between the charts but the one that stands out the most is that the ChartFX charts have a fancy border. This also happens to be something that JFreeChart can&#039;t do out of the box with all the other changes that need to be made are just settings that can be done in JFreeChart. So here is how I went about fixing it so that a JFreeChart has the fancy background.</p>
<p>The first thing you need is to be able to generate the chart as an image using JFreeChart.createBufferedImage. This will give you back a BufferedImage that you can then merge with the background you create.</p>
<p>The next thing you need is the background. In this case it is made with rounded edges, a gradient, and a drop shadow. The rounded edges and gradient are easy enough to make since they are just normal Java2D options (see the following code example for details). The real trick is the drop shadow. For that I looked around and found the following two articles: <a href="http://www.curious-creature.org/2005/07/07/fast-or-good-drop-shadows/">fast or good drop shadows</a> and <a href="http://www.curious-creature.org/2005/07/06/non-rectangular-shadow/">non-rectangular drop shadows</a>. These weren&#039;t exactly what I needed because I already know the shape of the object every time but they gave me what I needed to create the shadow easily. </p>
<p>To generate the drop shadow I first draw the rounded edged rectangle with a gradient fill. Then I use the a convolve operation described in the above articles to add a nice fuzzy blur. The last thing I do is offset the blurred image a little and then overlay the original on top of it.</p>
<p>Here is all the code to create an example:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aconvolveop+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ConvolveOp</span></a> getLinearBlurOp<span class="br0">&#40;</span><span class="kw4">int</span> width, <span class="kw4">int</span> height<span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw4">float</span><span class="br0">&#91;</span><span class="br0">&#93;</span> data <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw4">float</span><span class="br0">&#91;</span>width <span class="sy0">*</span> height<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw4">float</span> value <span class="sy0">=</span> 1.0f <span class="sy0">/</span> <span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>width <span class="sy0">*</span> height<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> data.<span class="me1">length</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; data<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0">=</span> value<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aconvolveop+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ConvolveOp</span></a><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Akernel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Kernel</span></a><span class="br0">&#40;</span>width, height, data<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedImage</span></a> buildChartDropShadow<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedImage</span></a> chartImage, <span class="kw4">int</span> padding<span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> buildChartDropShadow<span class="br0">&#40;</span>chartImage, padding, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedImage</span></a> buildChartDropShadow<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedImage</span></a> chartImage, <span class="kw4">int</span> padding, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acolor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Color</span></a> backgroundColor<span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedImage</span></a> shadow <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedImage</span></a><span class="br0">&#40;</span>chartImage.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="br0">&#40;</span>padding<span class="sy0">*</span>2<span class="br0">&#41;</span>, chartImage.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="br0">&#40;</span>padding<span class="sy0">*</span>2<span class="br0">&#41;</span>, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedImage</span></a>.<span class="me1">TYPE_INT_ARGB</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Agraphics2d+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Graphics2D</span></a> shadowCanvas <span class="sy0">=</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Agraphics2d+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Graphics2D</span></a><span class="br0">&#41;</span> shadow.<span class="me1">getGraphics</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; shadowCanvas.<span class="me1">setRenderingHint</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arenderinghints+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">RenderingHints</span></a>.<span class="me1">KEY_ANTIALIASING</span>, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arenderinghints+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">RenderingHints</span></a>.<span class="me1">VALUE_ANTIALIAS_ON</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; shadowCanvas.<span class="me1">setColor</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acolor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Color</span></a>.<span class="me1">white</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; shadowCanvas.<span class="me1">fillRect</span><span class="br0">&#40;</span>0, 0, chartImage.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="br0">&#40;</span>padding<span class="sy0">*</span>2<span class="br0">&#41;</span>, chartImage.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="br0">&#40;</span>padding<span class="sy0">*</span>2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; shadowCanvas.<span class="me1">setPaint</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acolor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Color</span></a>.<span class="me1">black</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; shadowCanvas.<span class="me1">fillRoundRect</span><span class="br0">&#40;</span>padding, padding, chartImage.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, chartImage.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, 20, 20<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; shadowCanvas.<span class="me1">dispose</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedImage</span></a> finalImage <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedImage</span></a><span class="br0">&#40;</span>chartImage.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="br0">&#40;</span>padding<span class="sy0">*</span>2<span class="br0">&#41;</span>, chartImage.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="br0">&#40;</span>padding<span class="sy0">*</span>2<span class="br0">&#41;</span>, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedImage</span></a>.<span class="me1">TYPE_INT_ARGB</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Agraphics2d+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Graphics2D</span></a> finalCanvas <span class="sy0">=</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Agraphics2d+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Graphics2D</span></a><span class="br0">&#41;</span> finalImage.<span class="me1">getGraphics</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; finalCanvas.<span class="me1">setRenderingHint</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arenderinghints+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">RenderingHints</span></a>.<span class="me1">KEY_ANTIALIASING</span>, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arenderinghints+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">RenderingHints</span></a>.<span class="me1">VALUE_ANTIALIAS_ON</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; finalCanvas.<span class="me1">setColor</span><span class="br0">&#40;</span>backgroundColor <span class="sy0">==</span> <span class="kw2">null</span> <span class="sy0">?</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acolor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Color</span></a>.<span class="me1">white</span> <span class="sy0">:</span> &nbsp;backgroundColor<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; finalCanvas.<span class="me1">fillRect</span><span class="br0">&#40;</span>0, 0, chartImage.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="br0">&#40;</span>padding<span class="sy0">*</span>2<span class="br0">&#41;</span>, chartImage.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="br0">&#40;</span>padding<span class="sy0">*</span>2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; finalCanvas.<span class="me1">drawImage</span><span class="br0">&#40;</span>shadow, getLinearBlurOp<span class="br0">&#40;</span>10, 10<span class="br0">&#41;</span>, 2, 2<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; finalCanvas.<span class="me1">setPaint</span><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Agradientpaint+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">GradientPaint</span></a><span class="br0">&#40;</span>0.0f, 0.0f, <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acolor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Color</span></a><span class="br0">&#40;</span>0xdc, 0xe5, 0xf4<span class="br0">&#41;</span>, 0.0f, chartImage.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">*</span> 0.2f, <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acolor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Color</span></a><span class="br0">&#40;</span>0xff, 0xff, 0xff<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; finalCanvas.<span class="me1">fillRoundRect</span><span class="br0">&#40;</span>padding, padding, chartImage.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, chartImage.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, 20, 20<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; finalCanvas.<span class="me1">drawImage</span><span class="br0">&#40;</span>chartImage, <span class="kw2">null</span>, padding, padding<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; finalCanvas.<span class="me1">dispose</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> finalImage<span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="co3">/**<br />
&nbsp; &nbsp;* Testing area<br />
&nbsp; &nbsp;*<br />
&nbsp; &nbsp;* @param args<br />
&nbsp; &nbsp;* @throws Exception<br />
&nbsp; &nbsp;*/</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; DefaultCategoryDataset dataset <span class="sy0">=</span> <span class="kw1">new</span> DefaultCategoryDataset<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; JFreeChart jFreeChart <span class="sy0">=</span> ChartFactory.<span class="me1">createBarChart</span><span class="br0">&#40;</span><span class="kw2">null</span>, <span class="kw2">null</span>, <span class="st0">&quot;Test&quot;</span>, dataset, PlotOrientation.<span class="me1">VERTICAL</span>, <span class="kw2">true</span>, <span class="kw2">false</span>, <span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; jFreeChart.<span class="me1">setBackgroundPaint</span><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acolor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Color</span></a><span class="br0">&#40;</span>255,255,255,0<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; jFreeChart.<span class="me1">setPadding</span><span class="br0">&#40;</span><span class="kw1">new</span> RectangleInsets<span class="br0">&#40;</span>10, 5, 5, 5<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; CategoryPlot plot <span class="sy0">=</span> <span class="br0">&#40;</span>CategoryPlot<span class="br0">&#41;</span> jFreeChart.<span class="me1">getPlot</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; BarRenderer renderer <span class="sy0">=</span> <span class="br0">&#40;</span>BarRenderer<span class="br0">&#41;</span> plot.<span class="me1">getRenderer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; renderer.<span class="me1">setDrawBarOutline</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; renderer.<span class="me1">setSeriesPaint</span><span class="br0">&#40;</span>0, <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acolor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Color</span></a><span class="br0">&#40;</span>0&#215;25, 0&#215;64, 0xc1<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; renderer.<span class="me1">setSeriesPaint</span><span class="br0">&#40;</span>1, <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acolor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Color</span></a><span class="br0">&#40;</span>0xc7, 0&#215;38, 0&#215;00<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; renderer.<span class="me1">setSeriesPaint</span><span class="br0">&#40;</span>2, <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acolor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Color</span></a><span class="br0">&#40;</span>0&#215;46, 0xb1, 0xc2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; renderer.<span class="me1">setSeriesPaint</span><span class="br0">&#40;</span>3, <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acolor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Color</span></a><span class="br0">&#40;</span>0&#215;76, 0xc8, 0x2d<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; NumberAxis numberaxis <span class="sy0">=</span> <span class="br0">&#40;</span>NumberAxis<span class="br0">&#41;</span>plot.<span class="me1">getRangeAxis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Adecimalformat+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">DecimalFormat</span></a> currencyFormat <span class="sy0">=</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Adecimalformat+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">DecimalFormat</span></a><span class="br0">&#41;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Anumberformat+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">NumberFormat</span></a>.<span class="me1">getCurrencyInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; currencyFormat.<span class="me1">setMaximumFractionDigits</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; numberaxis.<span class="me1">setNumberFormatOverride</span><span class="br0">&#40;</span>currencyFormat<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; jFreeChart.<span class="me1">getLegend</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">setHorizontalAlignment</span><span class="br0">&#40;</span>HorizontalAlignment.<span class="me1">LEFT</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; jFreeChart.<span class="me1">getLegend</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">setPosition</span><span class="br0">&#40;</span>RectangleEdge.<span class="me1">RIGHT</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; jFreeChart.<span class="me1">getLegend</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">setBorder</span><span class="br0">&#40;</span>0.0, 0.0, 0.0, 0.0<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; jFreeChart.<span class="me1">getLegend</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">setBackgroundPaint</span><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acolor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Color</span></a><span class="br0">&#40;</span>255,255,255,0<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; dataset.<span class="me1">addValue</span><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abigdecimal+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BigDecimal</span></a><span class="br0">&#40;</span><span class="nu0">10.0</span><span class="br0">&#41;</span>, <span class="st0">&quot;Value1&quot;</span>, <span class="st0">&quot;Sample&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; dataset.<span class="me1">addValue</span><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abigdecimal+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BigDecimal</span></a><span class="br0">&#40;</span><span class="nu0">13.0</span><span class="br0">&#41;</span>, <span class="st0">&quot;Value2&quot;</span>, <span class="st0">&quot;Sample&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; dataset.<span class="me1">addValue</span><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abigdecimal+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BigDecimal</span></a><span class="br0">&#40;</span><span class="nu0">18.0</span><span class="br0">&#41;</span>, <span class="st0">&quot;Value3&quot;</span>, <span class="st0">&quot;Sample&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw4">int</span> padding <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw4">int</span> width <span class="sy0">=</span> <span class="nu0">500</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw4">int</span> height <span class="sy0">=</span> <span class="nu0">300</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; ImageIO.<span class="me1">write</span><span class="br0">&#40;</span>GraphicsUtil.<span class="me1">buildChartDropShadow</span><span class="br0">&#40;</span>jFreeChart.<span class="me1">createBufferedImage</span><span class="br0">&#40;</span>width<span class="sy0">-</span><span class="br0">&#40;</span>padding<span class="sy0">*</span><span class="nu0">2</span><span class="br0">&#41;</span>, height<span class="sy0">-</span><span class="br0">&#40;</span>padding<span class="sy0">*</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, padding<span class="br0">&#41;</span>, <span class="st0">&quot;png&quot;</span>, <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Afileoutputstream+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">FileOutputStream</span></a><span class="br0">&#40;</span><span class="st0">&quot;/tmp/test.png&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystemexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">SystemException</span></a><span class="br0">&#40;</span>e.<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, e<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Here are the resulting graph differences. As you can see there aren&#039;t many and those that are still there could even be removed with a little more work.</p>
<p>ChartFX for Java:<br />
<img src="http://www.ioncannon.net/wp-content/uploads/2008/06/jfxchart.png"/></p>
<p>JFreeChart:<br />
<img src="http://www.ioncannon.net/wp-content/uploads/2008/06/jfreechart.png"/></p>
<p>Tags: <a href="http://technorati.com/tag/jfreechart" rel="tag">jfreechart</a>, <a href="http://technorati.com/tag/chart" rel="tag"> chart</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ioncannon.net/java/139/spiffing-up-jfreechart-charts/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Connection timeouts with the Apache commons TelnetClient</title>
		<link>http://www.ioncannon.net/java/132/connection-timeouts-with-the-apache-commons-telnetclient/</link>
		<comments>http://www.ioncannon.net/java/132/connection-timeouts-with-the-apache-commons-telnetclient/#comments</comments>
		<pubDate>Tue, 24 Jul 2007 16:13:57 +0000</pubDate>
		<dc:creator>carson</dc:creator>
				<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.ioncannon.net/java/132/connection-timeouts-with-the-apache-commons-telnetclient/</guid>
		<description><![CDATA[I recently used the Apache commons net package in a project to create a small telnet client that automated a login process. It is hard to find a lot of documentation on TelnetClient but there are some examples. For what I wanted to use the telnet client for I ran into a problem because I [...]]]></description>
			<content:encoded><![CDATA[<p>I recently used the <a href="http://jakarta.apache.org/commons/net/">Apache commons net package</a> in a project to create a small telnet client that automated a login process. It is hard to find a lot of documentation on <a href="http://jakarta.apache.org/commons/net/apidocs/org/apache/commons/net/telnet/TelnetClient.html">TelnetClient</a> but there are some examples. For what I wanted to use the telnet client for I ran into a problem because I needed the connect call to time out. Try as I might I couldn&#039;t get <a href="http://jakarta.apache.org/commons/net/apidocs/org/apache/commons/net/SocketClient.html#setDefaultTimeout(int)">setDefaultTimeout</a> to work as advertised.</p>
<p><span id="more-132"></span></p>
<p>As it turns out the Apache commons developers are trying to keep the net commons package compatible with java 1.3 for some reason (see <a href="http://issues.apache.org/jira/browse/NET-141">this issue in jira</a>). If you want to have your connect request time out you have to implement your own <a href="http://jakarta.apache.org/commons/net/apidocs/org/apache/commons/net/SocketFactory.html">SocketFactory</a> first. Since there seems to be a lot of confusion on this and the commons net project seems to be idle now I figured it was worth writing about in case other people ever go looking.</p>
<p>Here is an example with a custom SocketFactory that will get the timeouts to work on connect:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">package</span> <span class="co2">net.ioncannon</span><span class="sy0">;</span></p>
<p><span class="kw1">import</span> <span class="co2">org.apache.commons.net.telnet.TelnetClient</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.apache.commons.net.SocketFactory</span><span class="sy0">;</span></p>
<p><span class="kw1">import</span> <span class="co2">java.io.IOException</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.io.InputStreamReader</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.io.BufferedReader</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.net.*</span><span class="sy0">;</span></p>
<p><span class="kw1">public</span> <span class="kw1">class</span> TelAllTestMain<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; TelnetClient telnetClient <span class="sy0">=</span> <span class="kw1">new</span> TelnetClient<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; telnetClient.<span class="me1">setSocketFactory</span><span class="br0">&#40;</span><span class="kw1">new</span> TimeoutSockectFactory<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; telnetClient.<span class="me1">setDefaultTimeout</span><span class="br0">&#40;</span>1000<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; telnetClient.<span class="me1">connect</span><span class="br0">&#40;</span><span class="st0">&quot;localhost&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; telnetClient.<span class="me1">setSoTimeout</span><span class="br0">&#40;</span>1000<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; telnetClient.<span class="me1">setSoLinger</span><span class="br0">&#40;</span><span class="kw2">true</span>, 1000<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedReader</span></a> reader <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedReader</span></a><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainputstreamreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">InputStreamReader</span></a><span class="br0">&#40;</span>telnetClient.<span class="me1">getInputStream</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astringbuffer+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">StringBuffer</span></a> stringBuffer <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astringbuffer+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">StringBuffer</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw4">char</span> buffer<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw4">char</span><span class="br0">&#91;</span>1024<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw4">int</span> size <span class="sy0">=</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>size <span class="sy0">=</span> reader.<span class="me1">read</span><span class="br0">&#40;</span>buffer<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="sy0">-</span>1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; stringBuffer.<span class="me1">append</span><span class="br0">&#40;</span>buffer, 0, size<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>stringBuffer.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">endsWith</span><span class="br0">&#40;</span><span class="st0">&quot;something&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">err</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Found the string&#8230;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">err</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Didn&#039;t find the string&#8230;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span> &nbsp; &nbsp; &nbsp;</p>
<p>&nbsp; &nbsp; telnetClient.<span class="me1">disconnect</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">class</span> TimeoutSockectFactory <span class="kw1">implements</span> SocketFactory<br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> createSocket<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> hostname, <span class="kw4">int</span> port<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> socket <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; socket.<span class="me1">connect</span><span class="br0">&#40;</span><span class="kw1">new</span> InetSocketAddress<span class="br0">&#40;</span>hostname, port<span class="br0">&#41;</span>, 1000<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> socket<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> createSocket<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainetaddress+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">InetAddress</span></a> hostAddress, <span class="kw4">int</span> port<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> socket <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; socket.<span class="me1">connect</span><span class="br0">&#40;</span><span class="kw1">new</span> InetSocketAddress<span class="br0">&#40;</span>hostAddress, port<span class="br0">&#41;</span>, 1000<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> socket<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> createSocket<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> remoteHost, <span class="kw4">int</span> remotePort, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainetaddress+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">InetAddress</span></a> localAddress, <span class="kw4">int</span> localPort<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> createSocket<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainetaddress+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">InetAddress</span></a> remoteAddress, <span class="kw4">int</span> remotePort, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainetaddress+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">InetAddress</span></a> localAddress, <span class="kw4">int</span> localPort<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a> createServerSocket<span class="br0">&#40;</span><span class="kw4">int</span> port<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a> createServerSocket<span class="br0">&#40;</span><span class="kw4">int</span> port, <span class="kw4">int</span> backlog<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a> createServerSocket<span class="br0">&#40;</span><span class="kw4">int</span> port, <span class="kw4">int</span> backlog, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainetaddress+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">InetAddress</span></a> bindAddress<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Tags: <a href="http://technorati.com/tag/java" rel="tag">java</a>, <a href="http://technorati.com/tag/apache" rel="tag"> apache</a>, <a href="http://technorati.com/tag/commons" rel="tag"> commons</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ioncannon.net/java/132/connection-timeouts-with-the-apache-commons-telnetclient/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Using Java to get detailed DNS information</title>
		<link>http://www.ioncannon.net/system-administration/58/using-java-to-get-detailed-dns-information/</link>
		<comments>http://www.ioncannon.net/system-administration/58/using-java-to-get-detailed-dns-information/#comments</comments>
		<pubDate>Sun, 19 Nov 2006 18:03:38 +0000</pubDate>
		<dc:creator>carson</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[system administration]]></category>
		<category><![CDATA[utilities]]></category>

		<guid isPermaLink="false">http://www.ioncannon.net/system-administration/58/using-java-to-get-detailed-dns-information/</guid>
		<description><![CDATA[Not long ago I was curious about using Java to look up DNS information so I decided to put together a little DNSBL/RBL checker so I could experiment with Java DNS lookups and some PHP/Java communications. There isn&#039;t a lot of Java DNS stuff out there but it was easy to tell that the tool [...]]]></description>
			<content:encoded><![CDATA[<p>Not long ago I was curious about using Java to look up DNS information so I decided to put together a little <a href="http://www.ioncannon.net/dnsbl/ ">DNSBL/RBL checker</a> so I could experiment with Java DNS lookups and some PHP/Java communications. There isn&#039;t a lot of Java DNS stuff out there but it was easy to tell that the tool for this job is the <a href="http://www.dnsjava.org/">DNSJava</a> library.<br />
<span id="more-58"></span></p>
<p>We aren&#039;t just talking about resolving a name into an IP address or an IP into a name here, we are talking about being able to get all the other information that is stored in the DNS as well. If all you want to do is resolve names then Java has that built in. DNSJava lets you get at all the records for a domain name and as a bonus you could create your own DNS server with DNSJava if you wanted.</p>
<p>When working with a DNSBL you prepend an IP address to the domain for the DNSBL and then query based on that. For example the IP 127.0.0.2 is a test IP for most lists and if you wanted to use the Spamhaus combined SBL/XBL check (domain sbl-xbl.spamhaus.org) you would query on 2.0.0.127.sbl-xbl.spamhaus.org (notice the IP address is reversed). In this case the request will respond with a listing since 127.0.0.2 is a test address that is always listed. The simple fact that the address resolves is enough to know that the IP is listed but if you look at the TXT record of the listing you can find out more information. The following example will display the SBL/XLB record for the IP given in the <b>ipAddress</b> variable (make sure if you change it you reverse the IP address you are trying to query).</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">import</span> <span class="co2">org.xbill.DNS.*</span><span class="sy0">;</span></p>
<p><span class="kw1">import</span> <span class="co2">java.util.Iterator</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.net.UnknownHostException</span><span class="sy0">;</span></p>
<p><span class="co3">/**<br />
&nbsp;*/</span><br />
<span class="kw1">public</span> <span class="kw1">class</span> ExampleOne<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aunknownhostexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnknownHostException</span></a>, TextParseException<br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> ipAddress <span class="sy0">=</span> <span class="st0">&quot;2.0.0.127&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> dnsblDomain <span class="sy0">=</span> <span class="st0">&quot;sbl-xbl.spamhaus.org&quot;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; Lookup lookup <span class="sy0">=</span> <span class="kw1">new</span> Lookup<span class="br0">&#40;</span>ipAddress <span class="sy0">+</span> <span class="st0">&quot;.&quot;</span> <span class="sy0">+</span> dnsblDomain, Type.<span class="me1">ANY</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aresolver+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Resolver</span></a> resolver <span class="sy0">=</span> <span class="kw1">new</span> SimpleResolver<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; lookup.<span class="me1">setResolver</span><span class="br0">&#40;</span>resolver<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; lookup.<span class="me1">setCache</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; Record<span class="br0">&#91;</span><span class="br0">&#93;</span> records <span class="sy0">=</span> lookup.<span class="me1">run</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>lookup.<span class="me1">getResult</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> Lookup.<span class="me1">SUCCESSFUL</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> responseMessage <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> listingType <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> records.<span class="me1">length</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>records<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="kw1">instanceof</span> TXTRecord<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TXTRecord txt <span class="sy0">=</span> <span class="br0">&#40;</span>TXTRecord<span class="br0">&#41;</span> records<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aiterator+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Iterator</span></a> j <span class="sy0">=</span> txt.<span class="me1">getStrings</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">iterator</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> j.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; responseMessage <span class="sy0">+=</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#41;</span>j.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">&#40;</span>records<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="kw1">instanceof</span> ARecord<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listingType <span class="sy0">=</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>ARecord<span class="br0">&#41;</span>records<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span>.<span class="me1">getAddress</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getHostAddress</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">err</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Found!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">err</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Response Message: &quot;</span> <span class="sy0">+</span> responseMessage<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">err</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Listing Type: &quot;</span> <span class="sy0">+</span> listingType<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">&#40;</span>lookup.<span class="me1">getResult</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> Lookup.<span class="me1">HOST_NOT_FOUND</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">err</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Not found.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">err</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Error!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>The TXT entry is just one of the extra entries you may be interested in. The DNSJava library supports a large number of other types that can all be found by looking at the <a href="http://www.dnsjava.org/dnsjava-current/doc/">DNSJava javadocs</a>. For some more examples see the <a href="http://www.dnsjava.org/dnsjava-current/examples.htmll">DNSJava example page</a>.</p>
<p>Tags: <a href="http://technorati.com/tag/java" rel="tag">java</a>, <a href="http://technorati.com/tag/dns" rel="tag"> dns</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ioncannon.net/system-administration/58/using-java-to-get-detailed-dns-information/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Building firefox and mozilla tools on an AMD64</title>
		<link>http://www.ioncannon.net/linux/88/building-firefox-and-mozilla-tools-on-an-amd64/</link>
		<comments>http://www.ioncannon.net/linux/88/building-firefox-and-mozilla-tools-on-an-amd64/#comments</comments>
		<pubDate>Fri, 21 Jul 2006 12:00:15 +0000</pubDate>
		<dc:creator>carson</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.ioncannon.net/linux/88/building-firefox-and-mozilla-tools-on-an-amd64/</guid>
		<description><![CDATA[Sometimes I curse the day I decided to get a 64 bit box. Everything is fine until I want to build something by hand or upgrade something and then if it doesn&#039;t just work it is like a maze of problems. Recently I was trying to build firefox from source along with XULRunner so that [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes I curse the day I decided to get a 64 bit box. Everything is fine until I want to build something by hand or upgrade something and then if it doesn&#039;t just work it is like a maze of problems. </p>
<p>Recently I was trying to build firefox from source along with XULRunner so that I could try out <a href="http://developer.mozilla.org/en/docs/JavaXPCOM">JavaXPCOM</a>. The first problem I ran into was a GCC 4 bug that breaks the build. Luckily someone out there had an easy fix for the problem (see <a href="http://benjamin.smedbergs.us/blog/2005-10-27/gcc-40-workaround/">GCC4.0 &#8211; relocation R_X86_64_PC32 against memcpy@@GLIBC_2.2.5 can not be used</a>). After getting that problem fixed an a little fight with setting up XULRunner I got a very simple program working. That is when the 2nd problem showed up. When I tried to use some of the GUI functions I started getting core dumps from within GTK2. At that point I gave up and moved to my laptop. The same code worked right off using my laptop.</p>
<p>I should have instructions soon on how to embed gecko into a java app with JavaXPCOM. There isn&#039;t much documentation or example code out there on making it work. As for the 64 bit box, I think I have had about as much of it as I can take. At least it can run in 32 bit mode when I decide to re-install.</p>
<p>Tags: <a href="http://technorati.com/tag/xpcom" rel="tag">xpcom</a>, <a href="http://technorati.com/tag/mozilla" rel="tag"> mozilla</a>, <a href="http://technorati.com/tag/xulrunner" rel="tag"> xulrunner</a>, <a href="http://technorati.com/tag/amd64" rel="tag"> amd64</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ioncannon.net/linux/88/building-firefox-and-mozilla-tools-on-an-amd64/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thread pooling with Java concurrency utilities new (java 1.5) and old (util.concurrent)</title>
		<link>http://www.ioncannon.net/java/30/thread-pooling-with-java-concurrency-utilities-new-java-15-and-old-utilconcurrent/</link>
		<comments>http://www.ioncannon.net/java/30/thread-pooling-with-java-concurrency-utilities-new-java-15-and-old-utilconcurrent/#comments</comments>
		<pubDate>Mon, 24 Apr 2006 16:21:17 +0000</pubDate>
		<dc:creator>carson</dc:creator>
				<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.ioncannon.net/uncategorized/30/thread-pooling-with-java-concurrency-utilities-new-java-15-and-old-utilconcurrent/</guid>
		<description><![CDATA[Java Concurrency in Practice Threading in java is fairly easy and now with java 1.5 some of the stuff that was harder has become even easier. A few years ago someone pointed me to a site that had some concurrency utils that where the precursor to what are now the concurrent utils in java 1.5. [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; width: 106px;"><a href="http://www.amazon.com/exec/obidos/redirect?tag=httpblogforsm-20%26link_code=xm2%26camp=2025%26creative=165953%26path=http://www.amazon.com/gp/redirect.html%253fASIN=0321349601%2526tag=httpblogforsm-20%2526lcode=xm2%2526cID=2025%2526ccmID=165953%2526location=/o/ASIN/0321349601%25253FSubscriptionId=1NBF6KFYQSVK18ZKM7G2" title="View product details at Amazon"><img src="http://images.amazon.com/images/P/0321349601.01._SCMZZZZZZZ_.jpg" alt="Java Concurrency in Practice" /><br/>Java Concurrency in Practice</a></div>
<p>Threading in java is fairly easy and now with java 1.5 some of the stuff that was harder has become even easier. A few years ago someone pointed me to a site that had some concurrency utils that where the precursor to what are now the concurrent utils in java 1.5. They are very close in functionality and if you can&#039;t use java 1.5 the older version of the utils will work with older versions of java and give you a lot of the same functionality.</p>
<p>I&#039;m going to give a quick thread pooling example using both the new and old concurrency utils. I picked the thread pooling out of both since that seems to be what I end up using the most out of all the new utilities. I may revisit this again at some point to go over the periodic executors or some of the other things I have used but just not as much. </p>
<p><span id="more-30"></span></p>
<p>
The examples are for a network server that needs to process requests from clients. It is nice if each client doesn&#039;t have to wait for the other to finish and one of the easiest ways of doing that is to create threads for each client request. We will start with some code that is common between both concurrent implementations. Both versions will execute Runnable classes so the following class implements Runnable and will be the code that gets run with each new client request.</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">import</span> <span class="co2">org.apache.log4j.Logger</span><span class="sy0">;</span></p>
<p><span class="kw1">import</span> <span class="co2">java.net.Socket</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.io.*</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.util.Map</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.util.HashMap</span><span class="sy0">;</span></p>
<p><span class="kw1">public</span> <span class="kw1">class</span> RequestThread <span class="kw1">implements</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arunnable+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Runnable</span></a><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> Logger log <span class="sy0">=</span> Logger.<span class="me1">getLogger</span><span class="br0">&#40;</span>RequestThread.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> requestSocket <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">public</span> RequestThread<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> requestSocket<span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">requestSocket</span> <span class="sy0">=</span> requestSocket<span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">public</span> <span class="kw4">void</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedReader</span></a> bufferedReader <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedReader</span></a><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainputstreamreader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">InputStreamReader</span></a><span class="br0">&#40;</span>requestSocket.<span class="me1">getInputStream</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedwriter+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedWriter</span></a> bufferedWriter <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedwriter+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">BufferedWriter</span></a><span class="br0">&#40;</span><span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aoutputstreamwriter+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">OutputStreamWriter</span></a><span class="br0">&#40;</span>requestSocket.<span class="me1">getOutputStream</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; <span class="co1">// do some processing&#8230;</span></p>
<p>&nbsp; &nbsp; &nbsp; bufferedReader.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; bufferedWriter.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; log.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;Error communicating with client: &quot;</span> <span class="sy0">+</span> e.<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, e<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<h3>The java 1.5 concurrency utils example</h3>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">import</span> <span class="co2">java.net.ServerSocket</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.net.Socket</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.io.IOException</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.util.concurrent.ThreadPoolExecutor</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.util.concurrent.LinkedBlockingQueue</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.util.concurrent.TimeUnit</span><span class="sy0">;</span></p>
<p><span class="kw1">import</span> <span class="co2">org.apache.log4j.Logger</span><span class="sy0">;</span></p>
<p><span class="kw1">public</span> <span class="kw1">class</span> NetworkServer<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> Logger log <span class="sy0">=</span> Logger.<span class="me1">getLogger</span><span class="br0">&#40;</span>NetworkServer.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> THREAD_COUNT <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">short</span> LISTEN_PORT <span class="sy0">=</span> <span class="nu0">3434</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a> serverSocket <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw4">boolean</span> shutdown <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">private</span> <span class="kw1">final</span> ThreadPoolExecutor pool <span class="sy0">=</span> <span class="kw1">new</span> ThreadPoolExecutor<span class="br0">&#40;</span>THREAD_COUNT, THREAD_COUNT, 10, TimeUnit.<span class="me1">SECONDS</span>, <span class="kw1">new</span> LinkedBlockingQueue<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">public</span> NetworkServer<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; serverSocket <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a><span class="br0">&#40;</span>LISTEN_PORT<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; pool.<span class="me1">shutdownNow</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> e<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="kw1">import</span> <span class="co2">java.net.ServerSocket</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.net.Socket</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.io.IOException</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.util.concurrent.ThreadPoolExecutor</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.util.concurrent.LinkedBlockingQueue</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.util.concurrent.TimeUnit</span><span class="sy0">;</span></p>
<p><span class="kw1">import</span> <span class="co2">org.apache.log4j.Logger</span><span class="sy0">;</span></p>
<p><span class="kw1">public</span> <span class="kw1">class</span> NetworkServer<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> Logger log <span class="sy0">=</span> Logger.<span class="me1">getLogger</span><span class="br0">&#40;</span>NetworkServer.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> THREAD_COUNT <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">short</span> LISTEN_PORT <span class="sy0">=</span> <span class="nu0">3434</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a> serverSocket <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw4">boolean</span> shutdown <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">private</span> <span class="kw1">final</span> ThreadPoolExecutor pool <span class="sy0">=</span> <span class="kw1">new</span> ThreadPoolExecutor<span class="br0">&#40;</span>THREAD_COUNT, THREAD_COUNT, 10, TimeUnit.<span class="me1">SECONDS</span>, <span class="kw1">new</span> LinkedBlockingQueue<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">public</span> NetworkServer<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; serverSocket <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a><span class="br0">&#40;</span>LISTEN_PORT<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; pool.<span class="me1">shutdownNow</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> e<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">public</span> <span class="kw4">void</span> serve<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="sy0">!</span>shutdown<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pool.<span class="me1">execute</span><span class="br0">&#40;</span><span class="kw1">new</span> RequestThread<span class="br0">&#40;</span>serverSocket.<span class="me1">accept</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; log.<span class="me1">error</span><span class="br0">&#40;</span>“<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> <span class="kw1">while</span> starting request<span class="sy0">:</span> “ <span class="sy0">+</span> e.<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, e<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">public</span> <span class="kw4">void</span> shutdown<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">shutdown</span> <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span><br />
&nbsp; &nbsp; pool.<span class="me1">shutdownNow</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; makeFinalConnection<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">private</span> <span class="kw4">void</span> makeFinalConnection<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> clientSocket <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a><span class="br0">&#40;</span>“localhost”, LISTEN_PORT<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; clientSocket.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p>&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">public</span> <span class="kw4">void</span> serve<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="sy0">!</span>shutdown<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pool.<span class="me1">execute</span><span class="br0">&#40;</span><span class="kw1">new</span> RequestThread<span class="br0">&#40;</span>serverSocket.<span class="me1">accept</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; log.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;Exception while starting request: &quot;</span> <span class="sy0">+</span> e.<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, e<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">public</span> <span class="kw4">void</span> shutdown<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">shutdown</span> <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span><br />
&nbsp; &nbsp; pool.<span class="me1">shutdownNow</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; makeFinalConnection<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">private</span> <span class="kw4">void</span> makeFinalConnection<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> clientSocket <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a><span class="br0">&#40;</span><span class="st0">&quot;localhost&quot;</span>, LISTEN_PORT<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; clientSocket.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<h3>The older java concurrency utils example</h3>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">import</span> <span class="co2">EDU.oswego.cs.dl.util.concurrent.PooledExecutor</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">EDU.oswego.cs.dl.util.concurrent.LinkedQueue</span><span class="sy0">;</span></p>
<p><span class="kw1">import</span> <span class="co2">java.net.ServerSocket</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.net.Socket</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.io.IOException</span><span class="sy0">;</span></p>
<p><span class="kw1">import</span> <span class="co2">org.apache.log4j.Logger</span><span class="sy0">;</span></p>
<p><span class="kw1">public</span> <span class="kw1">class</span> NetworkServer<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> Logger log <span class="sy0">=</span> Logger.<span class="me1">getLogger</span><span class="br0">&#40;</span>NetworkServer.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> THREAD_COUNT <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">short</span> LISTEN_PORT <span class="sy0">=</span> <span class="nu0">3434</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a> serverSocket <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">private</span> <span class="kw4">boolean</span> shutdown <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">private</span> <span class="kw1">final</span> PooledExecutor pool <span class="sy0">=</span> <span class="kw1">new</span> PooledExecutor<span class="br0">&#40;</span><span class="kw1">new</span> LinkedQueue<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">public</span> NetworkServer<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; pool.<span class="me1">setKeepAliveTime</span><span class="br0">&#40;</span><span class="sy0">-</span>1<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; pool.<span class="me1">createThreads</span><span class="br0">&#40;</span>THEAD_COUNT<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; serverSocket <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserversocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a><span class="br0">&#40;</span>LISTEN_PORT<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; pool.<span class="me1">shutdownNow</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> e<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">public</span> <span class="kw4">void</span> serve<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="sy0">!</span>shutdown<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pool.<span class="me1">execute</span><span class="br0">&#40;</span><span class="kw1">new</span> RequestThread<span class="br0">&#40;</span>serverSocket.<span class="me1">accept</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; log.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;Exception while starting request: &quot;</span> <span class="sy0">+</span> e.<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, e<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">public</span> <span class="kw4">void</span> shutdown<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">shutdown</span> <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span><br />
&nbsp; &nbsp; pool.<span class="me1">drain</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; pool.<span class="me1">shutdownNow</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; makeFinalConnection<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">private</span> <span class="kw4">void</span> makeFinalConnection<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> clientSocket <span class="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a><span class="br0">&#40;</span><span class="st0">&quot;localhost&quot;</span>,LISTEN_PORT<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; clientSocket.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>As you can see the concurrency utils in java 1.5 are a close match to what is available in the older edu.oswego.cs.dl.util.concurrent packages. This makes it fairly easy to create thread pools when you are stuck having to use an older version of java. It also helps a lot when upgrading from that old version of java to the newer java 1.5.</p>
<p>To find out more about the java 1.5 concurrency utils or the older util.concurrent project visit the following links: </p>
<p><a href="http://java.sun.com/j2se/1.5.0/docs/guide/concurrency/">Concurrent utils in java 1.5</a> </p>
<p><a href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html">edu.oswego.cs.dl.util.concurrent project</a>
</p>
<p>Tags: <a href="http://technorati.com/tag/java" rel="tag">java</a>, <a href="http://technorati.com/tag/thread+pool" rel="tag"> thread pool</a>, <a href="http://technorati.com/tag/concurrency" rel="tag"> concurrency</a>, <a href="http://technorati.com/tag/java+1.5" rel="tag"> java 1.5</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ioncannon.net/java/30/thread-pooling-with-java-concurrency-utilities-new-java-15-and-old-utilconcurrent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JDBC + Batch updates + Non-Standard == Oracle</title>
		<link>http://www.ioncannon.net/java/52/jdbc-batch-updates-non-standard-oracle/</link>
		<comments>http://www.ioncannon.net/java/52/jdbc-batch-updates-non-standard-oracle/#comments</comments>
		<pubDate>Sat, 11 Feb 2006 23:21:02 +0000</pubDate>
		<dc:creator>carson</dc:creator>
				<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.ioncannon.net/uncategorized/52/jdbc-batch-updates-non-standard-oracle/</guid>
		<description><![CDATA[I recently ran into an issue where doing a large number of inserts and updates in an Oracle 8i database was taking forever. I was already using a prepared statement and commiting only after a certain number of rows. After some digging I found out that there is a special Oracle way of doing batch [...]]]></description>
			<content:encoded><![CDATA[<p>I recently ran into an issue where doing a large number of inserts and updates in an Oracle 8i database was taking forever. I was already using a prepared statement and commiting only after a certain number of rows. After some digging I found out that there is a special Oracle way of doing batch updates that made things a good bit faster. They do support the normal addBatch batch updates but it isn&#039;t as fast as using their special way. </p>
<p><span id="more-52"></span></p>
<p>Here is an example of how to do things their way:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> doBatchInsert<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alist+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">List</span></a> aLargeList, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aconnection+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Connection</span></a> connection<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asqlexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">SQLException</span></a><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="co1">// You have to turn auto commit off, if you are doing a large set of inserts and updates you are probably doing this already.</span><br />
&nbsp; connection.<span class="me1">setAutoCommit</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Apreparedstatement+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">PreparedStatement</span></a> preparedStatement <span class="sy0">=</span> connection.<span class="me1">prepareStatement</span><span class="br0">&#40;</span><span class="st0">&quot;insert into a_table(a_col) values (?)&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="co1">// This is the magic. Set the number of statements to allow in one batch</span><br />
&nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span>OraclePreparedStatement<span class="br0">&#41;</span>ps<span class="br0">&#41;</span>.<span class="me1">setExecuteBatch</span> <span class="br0">&#40;</span>10<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw4">int</span> count <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aiterator+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Iterator</span></a> i<span class="sy0">=</span>aLargeList.<span class="me1">iterator</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> i.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> count<span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; YourData yourData <span class="sy0">=</span> <span class="br0">&#40;</span>YourData<span class="br0">&#41;</span>i.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; preparedStatement.<span class="me1">setInt</span><span class="br0">&#40;</span>1, yourData.<span class="me1">getAnInt</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; preparedStatement.<span class="me1">executeUpdate</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>count <span class="sy0">%</span> <span class="nu0">10</span> <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="co1">// Send all currently queued statements</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span>OraclePreparedStatement<span class="br0">&#41;</span>preparedStatement<span class="br0">&#41;</span>.<span class="me1">sendBatch</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; connection.<span class="me1">commit</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span>OraclePreparedStatement<span class="br0">&#41;</span>preparedStatement<span class="br0">&#41;</span>.<span class="me1">sendBatch</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; connection.<span class="me1">commit</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; preapredStatement.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>
For more information see the following link:<br />
<a href="http://www.oracle.com/technology/products/oracle9i/daily/jun07.html">http://www.oracle.com/technology/products/oracle9i/daily/jun07.html</a>
</p>
<p>Tags: <a href="http://technorati.com/tag/java" rel="tag">java</a>, <a href="http://technorati.com/tag/jdbc" rel="tag"> jdbc</a>, <a href="http://technorati.com/tag/oracle" rel="tag"> oracle</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ioncannon.net/java/52/jdbc-batch-updates-non-standard-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

