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

<channel>
	<title>Blog of Peter Veentjer</title>
	<atom:link href="http://pveentjer.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://pveentjer.wordpress.com</link>
	<description>Multi-threading thoughts from a single threaded mind</description>
	<lastBuildDate>Mon, 02 Nov 2009 08:20:41 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='pveentjer.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/08240dc731b7828429a216dc35ce3fc0?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Blog of Peter Veentjer</title>
		<link>http://pveentjer.wordpress.com</link>
	</image>
			<item>
		<title>2 Types of Dao&#8217;s.</title>
		<link>http://pveentjer.wordpress.com/2009/11/02/2-types-of-daos/</link>
		<comments>http://pveentjer.wordpress.com/2009/11/02/2-types-of-daos/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 08:20:41 +0000</pubDate>
		<dc:creator>pveentjer</dc:creator>
				<category><![CDATA[Enterprise Java]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://pveentjer.wordpress.com/2009/11/02/2-types-of-daos/</guid>
		<description><![CDATA[From time to time I hear the discussion about how easy it is to replace dao implementations. But this isn&#8217;t as easy as it sounds because there are 2 types of dao&#8217;s:

session-less dao&#8217;s; e.g. an JDBC, IBatis or Gigaspaces implementation
session-based dao; e.g. a Hibernate/JPA implementation

One big difference between these 2 is that with a session-based [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=327&subd=pveentjer&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>From time to time I hear the discussion about how easy it is to replace dao implementations. But this isn&#8217;t as easy as it sounds because there are 2 types of dao&#8217;s:</p>
<ol>
<li>session-less dao&#8217;s; e.g. an JDBC, IBatis or Gigaspaces implementation</li>
<li>session-based dao; e.g. a Hibernate/JPA implementation</li>
</ol>
<p>One big difference between these 2 is that with a session-based dao, it doesn&#8217;t matter if an object is changed after a save/update has been called because the object is attached to the session. When the transaction commits it will commit the last state of the object because it can access these objects from the session. With a session-less dao&#8217;s, only the state of the object when the save/update was called will be persisted. Personally I prefer to name the save/update methods of a session-based dao &#8216;attach&#8217; because it makes clear what is really going on. And loaded objects are attached by default, so no need to call save/update on them.</p>
<p>Another big difference between these 2 is that with a session-based dao, you will get the same object instance within a transaction for some entity. So you don&#8217;t need to worry about accessing it more than once within a transaction. With session-less dao&#8217;s, you can get a new instance within a single transaction, every time you do a load. So you need to take care to update the correct instance.</p>
<p>So even though dao&#8217;s look easy to replace because they have an interface, there is a lot of &#8216;undocumented&#8217; behaviour that makes it a lot trickier than expected.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pveentjer.wordpress.com/327/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pveentjer.wordpress.com/327/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pveentjer.wordpress.com/327/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pveentjer.wordpress.com/327/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pveentjer.wordpress.com/327/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pveentjer.wordpress.com/327/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pveentjer.wordpress.com/327/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pveentjer.wordpress.com/327/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pveentjer.wordpress.com/327/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pveentjer.wordpress.com/327/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=327&subd=pveentjer&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://pveentjer.wordpress.com/2009/11/02/2-types-of-daos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d8b5cf3679fa7a4f32994df31d6fb180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pveentjer</media:title>
		</media:content>
	</item>
		<item>
		<title>Greg Young at Devnology</title>
		<link>http://pveentjer.wordpress.com/2009/09/17/greg-young-at-devnology/</link>
		<comments>http://pveentjer.wordpress.com/2009/09/17/greg-young-at-devnology/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 09:02:22 +0000</pubDate>
		<dc:creator>pveentjer</dc:creator>
				<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://pveentjer.wordpress.com/2009/09/17/greg-young-at-devnology/</guid>
		<description><![CDATA[Yesterday I attended a Distributed Domain Driven Design presentation given by Greg Young and organized by devnology at Xebia office. In the past I have been playing with DDD concepts but a lot of questions remained unanswered, even after asking them to Eric Evans when he was at the Xebia office a few years ago. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=324&subd=pveentjer&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Yesterday I attended a Distributed Domain Driven Design presentation given by Greg Young and organized by <a href="http://devnology.nl">devnology</a> at <a href="www.xebia.com">Xebia</a> office. In the past I have been playing with DDD concepts but a lot of questions remained unanswered, even after asking them to Eric Evans when he was at the Xebia office a few years ago. </p>
<p>The information provided by Greg made a lot of sense and it was nice to see that there is a better way for writing domain driven applications instead of the current often awkward approach. Creating different models for different needs and storing the event chain instead of storing the new state of an object really made sense. So it is certainly something I want to experiment with in the future. The well known &#8220;Patterns of Enterprise Application Architecture&#8221; written by Martin Fowler and &#8220;Domain-Driven Design: Tackling Complexity in the Heart of Software&#8221; written by Eric Evans, made the first steps in the enterprise domain driven design possible, but I think that Greg could lead us to the next step.</p>
<p>Apart from the technical content (very very important to me) it was also nice to see an enthusiastic and professional speaker. I would certainly place him in the same league as Fowler and Evens and I think that we are going to hear more about Greg in the future (a book perhaps?). </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pveentjer.wordpress.com/324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pveentjer.wordpress.com/324/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pveentjer.wordpress.com/324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pveentjer.wordpress.com/324/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pveentjer.wordpress.com/324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pveentjer.wordpress.com/324/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pveentjer.wordpress.com/324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pveentjer.wordpress.com/324/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pveentjer.wordpress.com/324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pveentjer.wordpress.com/324/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=324&subd=pveentjer&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://pveentjer.wordpress.com/2009/09/17/greg-young-at-devnology/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d8b5cf3679fa7a4f32994df31d6fb180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pveentjer</media:title>
		</media:content>
	</item>
		<item>
		<title>Multiverse: STM for Scala? Part I</title>
		<link>http://pveentjer.wordpress.com/2009/08/31/multiverse-stm-for-scala/</link>
		<comments>http://pveentjer.wordpress.com/2009/08/31/multiverse-stm-for-scala/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 18:10:43 +0000</pubDate>
		<dc:creator>pveentjer</dc:creator>
				<category><![CDATA[STM]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://pveentjer.wordpress.com/?p=311</guid>
		<description><![CDATA[Multiverse is a Java based STM implementation and last week I have been playing with integrating Multiverse in Scala. And since I have no practical experience with Scala and the Java language is not going anywhere (any more) it sounded like a nice opportunity to get started with Scala.
Multiverse supports 2 models for creating atomic [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=311&subd=pveentjer&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://multiverse.googlecode.com">Multiverse</a> is a Java based STM implementation and last week I have been playing with integrating Multiverse in Scala. And since I have no practical experience with Scala and the Java language is not going anywhere (any more) it sounded like a nice opportunity to get started with Scala.</p>
<p>Multiverse supports 2 models for creating atomic objects (objects managed by the STM) in the Java language. The simplest approach is adding an @AtomicObject annotation to a Pojo:</p>
<pre>
@AtomicObject
class Person{
   private int age;
   public int getAge(){return age;}
   public void setAge(int newAge){this.age = newAge;}
}
</pre>
<p>All changes made to person are atomic and isolated and the cool thing is that the get/setAge methods can participate in larger transactions (this solves the composability problem lock based approaches are suffering from). Using an @AtomicObject annotation is simple because you still can write normal Pojo&#8217;s. </p>
<p>The second model is using explicit refs (similar like Clojure refs).</p>
<pre>
class Person{
   private final Ref age = new Ref();
   public int getAge(){return age.get();}
   public void setAge(int newAge){age.set(newAge;}
}
</pre>
<p>Multiverse doesn&#8217;t care which model is being used. The first has a better syntax and probably is going to perform better when the Pojo has more than 1 field (although it could also lead to false write-conflicts). But the second model is very easy to integrate with Scala and doesn&#8217;t rely on instrumentation. In the future the first model is going to be added to Scala as well, but I need to have a better understanding of how Scala is compiled to bytecode.</p>
<p>One of the cool things about Scala is that it is very easy to add new language constructs using closures. If we look at the atomic functionality (so wrapping a transaction around a set of operations) in Java, we need to write a lot of verbose code:</p>
<pre>
int sum = new AtomicTemplate(){
    public Integer run(Transaction t){
         return person1.getAge()+person2.getAge()
   }
}.execute();
</pre>
<p>But in Scala you can say:</p>
<pre>
val sum = atomic{person1.age+person2.age}
</pre>
<p>Using the following closure:</p>
<pre>
 def atomic[E](body: =&gt; E): E = {
    new AtomicTemplate[E] {
      def execute(t: Transaction) = body
    }.execute()
  }
</pre>
<p>Isn&#8217;t that cool?</p>
<p>In the following blogposts I&#8217;ll explain the support for the retry and orelse mechanisms. </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pveentjer.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pveentjer.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pveentjer.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pveentjer.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pveentjer.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pveentjer.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pveentjer.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pveentjer.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pveentjer.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pveentjer.wordpress.com/311/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=311&subd=pveentjer&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://pveentjer.wordpress.com/2009/08/31/multiverse-stm-for-scala/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d8b5cf3679fa7a4f32994df31d6fb180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pveentjer</media:title>
		</media:content>
	</item>
		<item>
		<title>Spring AOP: Too complex for day to day use.</title>
		<link>http://pveentjer.wordpress.com/2009/08/17/spring-aop-too-complex-for-day-to-day-use/</link>
		<comments>http://pveentjer.wordpress.com/2009/08/17/spring-aop-too-complex-for-day-to-day-use/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 13:30:07 +0000</pubDate>
		<dc:creator>pveentjer</dc:creator>
				<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://pveentjer.wordpress.com/?p=304</guid>
		<description><![CDATA[I have done quite a lot with Spring and AOP in the past (have been a long time Spring supporter), but every time I need it in a project and look at the reference documentation, I find it more and more confusing and getting too complex for day to day use (especially if not every [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=304&subd=pveentjer&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I have done quite a lot with Spring and AOP in the past (have been a long time Spring supporter), but every time I need it in a project and look at the reference documentation, I find it more and more confusing and getting too complex for day to day use (especially if not every team member is a Spring expert). It is not because I don&#8217;t understand AOP:<br />
- I have used it for quite some time<br />
- I do quite a lot of bytecode manipulation on the <a href="http://multiverse.googlecode.com">Multiverse</a> project.</p>
<p>What is wrong with Spring AOP?<br />
- everything can be combined with everything in all kinds of different ways (so too many permutations)<br />
- there are 10.000 ways to configure it and the configuration can be spread all over the place (including in the source).<br />
- Spring documentation (which is very detailed) is not written in a way to get you up and running fast (so a complete working copy/paste hello world solution).<br />
- bytecode weaving of AspectJ gives problems with load time weaving (administrators, influences other applications on the same jvm) but compile time weaving in combination with Maven also gives problems because the bytecode is modified before the unit tests are executed. </p>
<p>It doesn&#8217;t mean that Spring AOP is bad from a technology point of view, but it certainly is bad from a productivity point of view. I love to solve complex problems, but I don&#8217;t like to solve problems that are needlessly complex. And Spring AOP imho is a good example of Spring becoming the problem it tried to solve: needless complexity. </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pveentjer.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pveentjer.wordpress.com/304/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pveentjer.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pveentjer.wordpress.com/304/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pveentjer.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pveentjer.wordpress.com/304/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pveentjer.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pveentjer.wordpress.com/304/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pveentjer.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pveentjer.wordpress.com/304/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=304&subd=pveentjer&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://pveentjer.wordpress.com/2009/08/17/spring-aop-too-complex-for-day-to-day-use/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d8b5cf3679fa7a4f32994df31d6fb180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pveentjer</media:title>
		</media:content>
	</item>
		<item>
		<title>Writing an Executor using STM</title>
		<link>http://pveentjer.wordpress.com/2009/08/09/writing-an-executor-using-stm/</link>
		<comments>http://pveentjer.wordpress.com/2009/08/09/writing-an-executor-using-stm/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 19:31:34 +0000</pubDate>
		<dc:creator>pveentjer</dc:creator>
				<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[STM]]></category>

		<guid isPermaLink="false">http://pveentjer.wordpress.com/?p=288</guid>
		<description><![CDATA[I&#8217;m working on the 0.3 release of Multiverse, a Java based STM implementation, creating replica&#8217;s of concurrent datastructures to understand better how it should evolve. The Executor from Java is a different type of datastructure than the standard queues/stacks (already available) etc, because it also needs to manage threads.
That is why I decided to create [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=288&subd=pveentjer&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I&#8217;m working on the 0.3 release of <a href="http://multiverse.googlecode.com">Multiverse</a>, a Java based STM implementation, creating replica&#8217;s of concurrent datastructures to understand better how it should evolve. The Executor from Java is a different type of datastructure than the standard queues/stacks (already available) etc, because it also needs to manage threads.</p>
<p>That is why I decided to create an example STM based implementation of the Executor interface.  It is lazy with thread creation and has a dynamic poolsize.</p>
<pre>
@AtomicObject
public class StmExecutor implements Executor {

    private final DoubleLinkedList workerThreads;
    private final DoubleLinkedQueue workQueue;
    private StmExecutorState state;
    private int poolSize;

    public StmExecutor(int poolSize, int maxCapacity) {
        if (poolSize &lt; 0) {
            throw new IllegalArgumentException();
        }

        this.workQueue = new DoubleLinkedQueue(maxCapacity);
        this.state = StmExecutorState.started;
        this.workerThreads = new DoubleLinkedList();
        this.poolSize = poolSize;
    }

    public void execute(Runnable task) {
        if (task == null) {
            throw new NullPointerException();
        }

        if (state != StmExecutorState.started) {
            throw new RejectedExecutionException();
        }

        workQueue.push(task);

        if (poolSize &gt; workerThreads.size() &amp;&amp; workQueue.size() &gt; 1) {
            createWorkers(1);
        }
    }

    public int getPoolSize() {
        return poolSize;
    }

    public int getActualPoolsize() {
        return workerThreads.size();
    }

    public boolean isShutdown() {
        return state == StmExecutorState.shutdown;
    }

    public void setPoolSize(int newPoolSize) {
        if (state != StmExecutorState.started) {
            throw new IllegalStateException();
        }

        createWorkers(newPoolSize - poolSize);
        this.poolSize = newPoolSize;
    }

    private void createWorkers(int workerCount) {
        if (workerCount &gt; 0) {
            DoubleLinkedList newWorkers = new DoubleLinkedList();
            for (int k = 0; k &lt; workerCount; k++) {
                newWorkers.add(new WorkerThread(this));
            }
            workerThreads.addAll(newWorkers);
            executePostCommit(new StartWorkerThreadsTask(newWorkers));
        }
    }

    public void shutdown() {
        if (workerThreads.isEmpty()) {
            state = StmExecutorState.shutdown;
        } else {
            state = StmExecutorState.shutdownInProgress;
        }
    }

    public void awaitShutdown() {
        if (!isShutdown()) {
            retry();
        }
    }

    //needed to overcome an instrumentation issue
    private StmExecutorState getState() {
        return state;
    }

    //needed to overcome an instrumentation issue
    private void setState(StmExecutorState state) {
        this.state = state;
    }

    //needed to overcome an instrumentation issue
    private DoubleLinkedList getWorkerThreads() {
        return workerThreads;
    }

    //needs to be a static inner class for now.
    static class WorkerThread extends Thread {
        private final StmExecutor executor;

        public WorkerThread(StmExecutor executor) {
            setName("Worker");
            this.executor = executor;
        }

        public void run() {
            boolean again;

            do {
                try {
                    again = runTask();
                } catch (Throwable ex) {
                    ex.printStackTrace();
                    again = true;
                }
            } while (again);
        }

        @AtomicMethod
        private boolean runTask() {
            if (isShuttingDown() || isTooMany()) {
                executor.getWorkerThreads().remove(this);

                if (isShuttingDown() &amp;&amp; executor.getWorkerThreads().isEmpty()) {
                    executor.setState(StmExecutorState.shutdown);
                }
                return false;
            }

            Runnable task = executor.workQueue.take();

            task.run();
            return true;
        }

        private boolean isTooMany() {
            return executor.getActualPoolsize() &gt; executor.getPoolSize();
        }

        private boolean isShuttingDown() {
            return executor.getState() == StmExecutorState.shutdownInProgress;
        }
    }

    static class StartWorkerThreadsTask implements Runnable {

        final DoubleLinkedList workerList;

        StartWorkerThreadsTask(DoubleLinkedList workerList) {
            this.workerList = workerList;
        }

        @Override
        public void run() {
            for (WorkerThread thread : workerList) {
                thread.start();
            }
        }
    }
}

enum StmExecutorState {
    started, shutdownInProgress, shutdown
}
</pre>
<p>As you can see, it is quite easy. And it certainly is a lot better than writing one using old school concurrency. I have written a few implementations for the <a href="http://prometheus.codehaus.org">Prometheus</a> project, so I know how complex they are to write. Especially the closing down part.  Another cool thing is that this executor can participate on already running transactions. So you don&#8217;t need to be worries about the fact that the work was placed on the queue even though the calling thread fails somehow later, so atomicity you also get for free.</p>
<p>There still are some issues although, if you look at the workqueue, there is lot of contention on the head and tail. A queue has just too strict ordering behaviour. So some kind of pessimistic locking mechanism (perhaps a less extreme version than the shared/exclusive.. where you still are allowed to do a write if others already obtained the lock), could help transactions to find non conflicting executions. This could be combined with something like striping.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pveentjer.wordpress.com/288/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pveentjer.wordpress.com/288/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pveentjer.wordpress.com/288/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pveentjer.wordpress.com/288/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pveentjer.wordpress.com/288/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pveentjer.wordpress.com/288/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pveentjer.wordpress.com/288/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pveentjer.wordpress.com/288/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pveentjer.wordpress.com/288/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pveentjer.wordpress.com/288/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=288&subd=pveentjer&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://pveentjer.wordpress.com/2009/08/09/writing-an-executor-using-stm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d8b5cf3679fa7a4f32994df31d6fb180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pveentjer</media:title>
		</media:content>
	</item>
		<item>
		<title>Remapping a method with ASM</title>
		<link>http://pveentjer.wordpress.com/2009/08/02/remapping-a-method-with-asm/</link>
		<comments>http://pveentjer.wordpress.com/2009/08/02/remapping-a-method-with-asm/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 11:26:08 +0000</pubDate>
		<dc:creator>pveentjer</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://pveentjer.wordpress.com/?p=283</guid>
		<description><![CDATA[Last few weeks I have been working at home on Multiverse (summer vacation), a Java based STM implementation. I use ASM based instrumentation to transforms POJO&#8217;s (with some additional annotations) so that certain interfaces and method implementations are added.
With Multiverse 0.2, I did all the method generation by hand (manually written bytecode) and this is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=283&subd=pveentjer&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Last few weeks I have been working at home on <a href="http://multiverse.googlecode.com">Multiverse</a> (summer vacation), a Java based STM implementation. I use <a href="http://asm.ow2.org/">ASM</a> based instrumentation to transforms POJO&#8217;s (with some additional annotations) so that certain interfaces and method implementations are added.</p>
<p>With Multiverse 0.2, I did all the method generation by hand (manually written bytecode) and this is a very time consuming and error-prone task. That is why I came up with a different idea for 0.3: make an abstract class that contains (most of) the implementation, and move the code from that class to another (essentially the class has become a mixin). By copying the methods/fields instead of making the mixin a super class, it prevents imposing  limitations on the class hierarchy. Luckily ASM has some functionality for this called the RemappingMethodAdapter. The problem is that this functionality is made to be used in the visitor api of ASM and not the Tree API and I&#8217;m using the latter one.</p>
<p>So I wrote function that iterates over the bytecode and transforms it. The problem is that this leads to more code to maintain and test. Rémi Forax of the ASM discussion group made a suggestion that the RemappingMethodAdapter can be used with the Tree api because the MethodNode has an accept function.</p>
<p>So to make a long story short, this is the code I&#8217;m using to remap a method from one class to another. And I hope it helps other people struggling with the same problems:</p>
<pre>
public static MethodNode remap(MethodNode originalMethod, Remapper remapper) {
        String[] exceptions = getExceptions(originalMethod);

        MethodNode mappedMethod = new MethodNode(
                originalMethod.access,
                originalMethod.name,
                remapper.mapMethodDesc(originalMethod.desc),
                remapper.mapSignature(originalMethod.signature, false),
                remapper.mapTypes(exceptions));

        RemappingMethodAdapter remapVisitor = new RemappingMethodAdapter(
                mappedMethod.access,
                mappedMethod.desc,
                mappedMethod,
                remapper);
        originalMethod.accept(remapVisitor);
        return mappedMethod;
    }

    public static String[] getExceptions(MethodNode originalMethod) {
        if (originalMethod.exceptions == null) {
            return new String[]{};
        }

        String[] exceptions = new String[originalMethod.exceptions.size()];
        originalMethod.exceptions.toArray(exceptions);
        return exceptions;
    }
</pre>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pveentjer.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pveentjer.wordpress.com/283/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pveentjer.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pveentjer.wordpress.com/283/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pveentjer.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pveentjer.wordpress.com/283/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pveentjer.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pveentjer.wordpress.com/283/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pveentjer.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pveentjer.wordpress.com/283/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=283&subd=pveentjer&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://pveentjer.wordpress.com/2009/08/02/remapping-a-method-with-asm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d8b5cf3679fa7a4f32994df31d6fb180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pveentjer</media:title>
		</media:content>
	</item>
		<item>
		<title>Kickass hardware for Multiverse up and running</title>
		<link>http://pveentjer.wordpress.com/2009/06/18/kickass-hardware-for-multiverse-up-and-running/</link>
		<comments>http://pveentjer.wordpress.com/2009/06/18/kickass-hardware-for-multiverse-up-and-running/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 09:00:14 +0000</pubDate>
		<dc:creator>pveentjer</dc:creator>
				<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[STM]]></category>

		<guid isPermaLink="false">http://pveentjer.wordpress.com/?p=260</guid>
		<description><![CDATA[A few weeks ago I received the last components of my dual Xeon 5500 configuration for Multiverse and I have been working on a framework for doing microbenchmarks. This framework has produced some nice diagrams that provide a lot of insight.
One of the things I wanted to see is how well the system scales with [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=260&subd=pveentjer&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>A few weeks ago I received the last components of my dual Xeon 5500 configuration for <a href="http://googlecode.com">Multiverse</a> and I have been working on a framework for doing microbenchmarks. This framework has produced some nice diagrams that provide a lot of insight.</p>
<p>One of the things I wanted to see is how well the system scales with and without contention. The graph below shows the result of a benchmark for various levels of contention for updating a counter stored in the stm:<br />
<img src="http://pveentjer.files.wordpress.com/2009/06/stm_completerangeofsharedandunshared.png?w=450&#038;h=337" alt="stm_completerangeofsharedandunshared" title="stm_completerangeofsharedandunshared" width="450" height="337" class="alignnone size-full wp-image-263" /></p>
<p>The slowest one is one with contended shared state: all threads share the same counter The blue one is a bit better because each thread gets his own counter. The green one is the same as the blue one but instead of using instrumentation, the classes are &#8216;instrumented&#8217; manually. And the last graph where each counter is placed in his own stm. </p>
<p>The big questions are:</p>
<ol>
<li>why is the performance difference between manual and real instrumentation so big. It can be partially explained by not having to access expensive fields like volatile (for the global stm) and threadlocals (current transaction) </li>
<li>why does the system scale so bad when transactions don&#8217;t share state, only the stm. The only point of contention is the shared logical clock (an AtomicLong). So I would expect a more linear growth.</li>
</ol>
<p>So a lot of hard questions to answer.</p>
<p>The benchmark framework is going to be integrated with the Continuous integration server so we have a continuous feedback on performance. One of the features that needs to be added is trend analysis, but since the data already is there, this should not be a difficult requirement to implement.</p>
<p><b>Update</b><br />
It appears that statics were still activated on the non manual instrumented version. Statistics cause a lot of cas updates. <img src="http://pveentjer.files.wordpress.com/2009/06/stm_completerangeofsharedandunshared1.png?w=450&#038;h=337" alt="stm_completerangeofsharedandunshared" title="stm_completerangeofsharedandunshared" width="450" height="337" class="alignnone size-full wp-image-273" /></p>
<p>As you can see the difference between the manual and the automatic ones has decreased. So that partially solves the first question.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pveentjer.wordpress.com/260/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pveentjer.wordpress.com/260/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pveentjer.wordpress.com/260/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pveentjer.wordpress.com/260/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pveentjer.wordpress.com/260/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pveentjer.wordpress.com/260/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pveentjer.wordpress.com/260/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pveentjer.wordpress.com/260/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pveentjer.wordpress.com/260/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pveentjer.wordpress.com/260/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=260&subd=pveentjer&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://pveentjer.wordpress.com/2009/06/18/kickass-hardware-for-multiverse-up-and-running/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d8b5cf3679fa7a4f32994df31d6fb180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pveentjer</media:title>
		</media:content>

		<media:content url="http://pveentjer.files.wordpress.com/2009/06/stm_completerangeofsharedandunshared.png" medium="image">
			<media:title type="html">stm_completerangeofsharedandunshared</media:title>
		</media:content>

		<media:content url="http://pveentjer.files.wordpress.com/2009/06/stm_completerangeofsharedandunshared1.png" medium="image">
			<media:title type="html">stm_completerangeofsharedandunshared</media:title>
		</media:content>
	</item>
		<item>
		<title>Multiverse 0.2 release nearing completion</title>
		<link>http://pveentjer.wordpress.com/2009/05/23/multiverse-0-2-release-nearing-completion/</link>
		<comments>http://pveentjer.wordpress.com/2009/05/23/multiverse-0-2-release-nearing-completion/#comments</comments>
		<pubDate>Sat, 23 May 2009 10:44:08 +0000</pubDate>
		<dc:creator>pveentjer</dc:creator>
				<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[STM]]></category>

		<guid isPermaLink="false">http://pveentjer.wordpress.com/?p=240</guid>
		<description><![CDATA[Multiverse is a Java based STM implementation and the 0.2 version is nearing completion and I hope to finish it before 1 July. The 0.2 version is going to be a very usable implementation, unlike the 0.1 release, where most configuration can be done by placing some annotations. For more information about annotation based configuration, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=240&subd=pveentjer&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://multiverse.googlecode.com">Multiverse</a> is a Java based STM implementation and the 0.2 version is nearing completion and I hope to finish it before 1 July. The 0.2 version is going to be a very usable implementation, unlike the 0.1 release, where most configuration can be done by placing some annotations. For more information about annotation based configuration, see the following <a href="http://code.google.com/p/multiverse/wiki/IntroductionToAnnotationBasedConfiguration">tutorial</a>. </p>
<h4>Goal for this release</h4>
<p>The goal of this release it to make Multiverse really easy to use, so that users don&#8217;t get scared (there is enough time for that) and let them realise that Software Transactional Memory can lead to a complete change in the way they write concurrent systems.</p>
<h4>Todo and future plans</h4>
<p>To see what needs to be done, check the following <a href="http://code.google.com/p/multiverse/issues/list?q=label%3A0.2">page</a>.  If you want to see what can be expected in the future, check the <a href="http://code.google.com/p/multiverse/issues/list?can=2&amp;q=label%3Abacklog">backlog</a>.  In the next release improving performance and scalability, and support for writing efficient STM data-structures, are going to be the most important goals. </p>
<h4>Moving to Codehaus</h4>
<p>I hope to move Multiverse to <a href="http://codehaus.org/">Codehaus</a> as soon as the proposal is accepted. <a href="http://code.google.com/">Google code</a> is nice, but Codehaus has better Java facilities (continuous integration server, Licenses for Java tooling etc).</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pveentjer.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pveentjer.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pveentjer.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pveentjer.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pveentjer.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pveentjer.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pveentjer.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pveentjer.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pveentjer.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pveentjer.wordpress.com/240/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=240&subd=pveentjer&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://pveentjer.wordpress.com/2009/05/23/multiverse-0-2-release-nearing-completion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d8b5cf3679fa7a4f32994df31d6fb180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pveentjer</media:title>
		</media:content>
	</item>
		<item>
		<title>Multiverse needs a community</title>
		<link>http://pveentjer.wordpress.com/2009/05/16/multiverse-needs-a-community/</link>
		<comments>http://pveentjer.wordpress.com/2009/05/16/multiverse-needs-a-community/#comments</comments>
		<pubDate>Sat, 16 May 2009 23:52:27 +0000</pubDate>
		<dc:creator>pveentjer</dc:creator>
				<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[STM]]></category>

		<guid isPermaLink="false">http://pveentjer.wordpress.com/?p=234</guid>
		<description><![CDATA[Multiverse is a Java based Software Transactional Memory implementation I have worked on for the last half year and I made a lot of progress and gained a lot of new insights. But there is too much to do for me alone and I would really like have some people on the project to learn [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=234&subd=pveentjer&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://multiverse.googlecode.com">Multiverse</a> is a Java based Software Transactional Memory implementation I have worked on for the last half year and I made a lot of progress and gained a lot of new insights. But there is too much to do for me alone and I would really like have some people on the project to learn from/teach things to/have fun with. So if you are interested in joining the community, have experience with concurrency control/instrumentation or would like to know a hell of a lot more about it, please send an email to alarmnummer at gmail.com. </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pveentjer.wordpress.com/234/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pveentjer.wordpress.com/234/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pveentjer.wordpress.com/234/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pveentjer.wordpress.com/234/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pveentjer.wordpress.com/234/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pveentjer.wordpress.com/234/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pveentjer.wordpress.com/234/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pveentjer.wordpress.com/234/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pveentjer.wordpress.com/234/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pveentjer.wordpress.com/234/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=234&subd=pveentjer&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://pveentjer.wordpress.com/2009/05/16/multiverse-needs-a-community/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d8b5cf3679fa7a4f32994df31d6fb180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pveentjer</media:title>
		</media:content>
	</item>
		<item>
		<title>The Springforum has lost its pazzaz</title>
		<link>http://pveentjer.wordpress.com/2009/05/16/the-springforum-has-lost-its-pazzaz/</link>
		<comments>http://pveentjer.wordpress.com/2009/05/16/the-springforum-has-lost-its-pazzaz/#comments</comments>
		<pubDate>Sat, 16 May 2009 10:26:09 +0000</pubDate>
		<dc:creator>pveentjer</dc:creator>
				<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://pveentjer.wordpress.com/?p=223</guid>
		<description><![CDATA[I have been reading and posting on the Spring forum since before it became mainstream, to be specific I joined on 22 November 2004. And under the name &#8216;Alarmnummer&#8217; I have placed more than 1000 posts (in most cases answers to questions). 
But the quality of the forum has dropped dramatically. Perhaps it is caused [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=223&subd=pveentjer&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I have been reading and posting on the Spring forum since before it became mainstream, to be specific I joined on 22 November 2004. And under the name &#8216;Alarmnummer&#8217; I have placed more than 1000 posts (in most cases answers to questions). </p>
<p>But the quality of the forum has dropped dramatically. Perhaps it is caused by:</p>
<ol>
<li>Spring becoming yet another bloated environment</li>
<li>closed design by Spring-team  and not the community</li>
<li>Spring getting too commercial</li>
</ol>
<p>Thereby loosing touch with the community and especially with smart early adaptors. </p>
<p>Most questions I see on the forum are not about design any more, but in a lot of cases RTFM (Read the Fucking Manual) or UTFS (Use the Fucking Search) and not fun to answer at all. </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pveentjer.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pveentjer.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pveentjer.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pveentjer.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pveentjer.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pveentjer.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pveentjer.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pveentjer.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pveentjer.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pveentjer.wordpress.com/223/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pveentjer.wordpress.com&blog=290887&post=223&subd=pveentjer&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://pveentjer.wordpress.com/2009/05/16/the-springforum-has-lost-its-pazzaz/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d8b5cf3679fa7a4f32994df31d6fb180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pveentjer</media:title>
		</media:content>
	</item>
	</channel>
</rss>