<?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>A Twofer &#187; AOP</title>
	<atom:link href="http://www.atwofer.com/category/aop/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.atwofer.com</link>
	<description>A place to talk about Software Development (RoR, J2EE, J2ME, CSS, HTML, JavaScript, Objective-C, etc) and some other stuff</description>
	<lastBuildDate>Fri, 16 Jul 2010 14:56:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Using AOP to Make Calls Asynchronous in Java</title>
		<link>http://www.atwofer.com/2008/12/16/using-aop-to-make-calls-asynchronous-in-java/</link>
		<comments>http://www.atwofer.com/2008/12/16/using-aop-to-make-calls-asynchronous-in-java/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 22:39:04 +0000</pubDate>
		<dc:creator>Randy</dc:creator>
				<category><![CDATA[AOP]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[MethodInterceptor]]></category>
		<category><![CDATA[MethodInvocation]]></category>

		<guid isPermaLink="false">http://www.atwofer.com/?p=23</guid>
		<description><![CDATA[I am working on a project called ScoreOut that consists of an application that runs on a phone that interacts with a server via a REST API.  The server is written in Java and makes heavy use of the Spring Framework.  I wanted to start tracking some of the actions that a user takes on [...]]]></description>
			<content:encoded><![CDATA[<p>I am working on a project called <a href="http://www.scoreout.com">ScoreOut</a> that consists of an application that runs on a phone that interacts with a server via a REST API.  The server is written in Java and makes heavy use of the <a href="http://www.springframework.org/">Spring Framework</a>.  I wanted to start tracking some of the actions that a user takes on the phone and recording those actions in our analytics tables.  For example, we want to record when a user logs in or requests a golf course.  However, we do not want to slow down the response to the client since the customer is probably out on a golf course at that time.  Therefore, it seemed to makes sense to perform any auditing asynchronously.</p>
<p>The server is broken up into services and I already had a service that did auditing.  I added two new methods to it recordClientLogin and recordCourseRetrieval.  I wanted these methods to be run asynchronously but I wanted the asychronousness (if this isn&#8217;t a word it should be) to be reusable and easily enabled or disabled (easier to unit test when disabled).  This immediately let me to use AOP so I wrote an interceptor.</p>
<p><code><br />
package com.scoreout.service.interceptor;<br />
<span> </span><br />
import org.aopalliance.intercept.MethodInterceptor;<br />
import org.aopalliance.intercept.MethodInvocation;<br />
import org.apache.commons.logging.Log;<br />
import org.apache.commons.logging.LogFactory;<br />
<span> </span><br />
/**<br />
<span style="padding-left: 8px;">* Intecepts a call and makes it asynchronous. If there is an error it is</span><br />
<span style="padding-left: 8px;">* simply logged.</span><br />
<span style="padding-left: 8px;">*/</span><br />
public class AsynchronizeInterceptor implements MethodInterceptor<br />
{<br />
<span> </span><br />
<span style="padding-left: 20px;">/**</span><br />
<span style="padding-left: 28px;">* Logger</span><br />
<span style="padding-left: 28px;">*/</span><br />
<span style="padding-left: 20px;">private static final Log LOG = LogFactory.</span><br />
<span style="padding-left: 40px;">getLog(AsynchronizeInterceptor.class);</span><br />
<span> </span><br />
<span style="padding-left: 20px;">/**</span><br />
<span style="padding-left: 28px;">* This method will always return null since the method is</span><br />
<span style="padding-left: 28px;">* invoked asynchronously.</span><br />
<span style="padding-left: 28px;">*</span><br />
<span style="padding-left: 28px;">* @see org.aopalliance.intercept.MethodInterceptor</span><br />
<span style="padding-left: 28px;">*          #invoke(org.aopalliance.intercept.MethodInvocation)</span><br />
<span style="padding-left: 28px;">*/</span><br />
<span style="padding-left: 20px;">public Object invoke(final MethodInvocation invocation) throws Throwable</span><br />
<span style="padding-left: 20px;">{</span><br />
<span style="padding-left: 40px;">Thread thread = new Thread()</span><br />
<span style="padding-left: 40px;">{</span><br />
<span style="padding-left: 60px;">public void run()</span><br />
<span style="padding-left: 60px;">{</span><br />
<span style="padding-left: 80px;">try</span><br />
<span style="padding-left: 80px;">{</span><br />
<span style="padding-left: 100px;">invocation.proceed();</span><br />
<span style="padding-left: 80px;">} catch (Throwable e)</span><br />
<span style="padding-left: 80px;">{</span><br />
<span style="padding-left: 100px;">LOG.warn("Asynchronous method invocation failed.", e);</span><br />
<span style="padding-left: 80px;">}</span><br />
<span style="padding-left: 60px;">}</span><br />
<span style="padding-left: 40px;">};</span><br />
<span> </span><br />
<span style="padding-left: 40px;">thread.start();</span><br />
<span> </span><br />
<span style="padding-left: 40px;">return null;</span><br />
<span style="padding-left: 20px;">}</span><br />
}</code></p>
<p>So this inteceptor will make any method it intercepts asynchronous running the method on a separate thread and returning immediately.  So now I just needed to add the point cut to the spring application context.<br />
<code><br />
&lt;!-- Turns methods calls into asynchronous method calls --&gt;<br />
&lt;bean id="asynchronizeInterceptor"<br />
<span style="padding-left: 30px;">class="com.scoreout.service.interceptor.AsynchronizeInterceptor"&gt;</span><br />
&lt;/bean&gt;<br />
<span> </span><br />
&lt;!-- Intercept caddie event recording method calls --&gt;<br />
&lt;bean id="asynchronizePointCut"<br />
<span style="padding-left: 30px;">class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"&gt;</span><br />
<span style="padding-left: 10px;">&lt;property name="advice"&gt;</span><br />
<span style="padding-left: 40px;">&lt;ref local="asynchronizeInterceptor" /&gt;</span><br />
<span style="padding-left: 10px;">&lt;/property&gt;</span><br />
<span style="padding-left: 10px;">&lt;property name="patterns"&gt;</span><br />
<span style="padding-left: 20px;">&lt;list&gt;</span><br />
<span style="padding-left: 30px;">&lt;value&gt;com.scoreout.service.Audit.recordCourseRetrieval*&lt;/value&gt;</span><br />
<span style="padding-left: 30px;">&lt;value&gt;com.scoreout.service.Audit.recordClientLogin*&lt;/value&gt;</span><br />
<span style="padding-left: 20px;">&lt;/list&gt;</span><br />
<span style="padding-left: 10px;">&lt;/property&gt;</span><br />
&lt;/bean&gt;</code></p>
<p>Now anytime I call com.scoreout.service.Audit.recordCourseRetrieval or com.scoreout.service.Audit.recordClientLogin the call will return immediately and the method will be run in the background.  For testing I can easily make these methods synchronous by either removing them from the application context or providing a new application context that does not include this pointcut (I generally prefer the latter).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.atwofer.com/2008/12/16/using-aop-to-make-calls-asynchronous-in-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
