The Spring Blog

News and Events

Querying and Downloading from Amazon S3

In a previous post, I described how we use a custom ANT task to upload nightly snapshots from the ANT based projects in the Spring portfolio. In this post I’ll describe how we use Amazon S3 to generate pages for the snapshots from each project and allow users to download the snapshots.

As I mentioned in the previous post, S3 is primarily used as a REST-ful service. This means that while I used Java for the upload portion, I was free to use other languages for the download portion. I chose to use PHP in this case because it was already available on the server I was working with, and was the path of least resistance.


Uploading to Amazon S3 using a custom ANT task

One of the interesting side effects of a solid CI structure is that when things are running reliably, new problems start to crop up. Shortly after Spring’s CI system started running smoothly, our occasional space and bandwidth issues on became more pronounced. Colin Sampaleanu had done research earlier on how to alleviate some of these problems and had settled on Amazon S3.

Amazon S3 is part of the Amazon Web Services umbrella and provides an incredibly cheap online file storage service. What does ‘incredibly cheap’ mean? Well, from the website, it appears that 1 GB*month of storage costs US$0.15 and 1 GB of bandwidth costs US$0.20. Add to that, a high-bandwidth transparent mirroring service, and S3 becomes very appealing for storing our nightly snapshots. On a tangent, Amazon actually uses the exact same infrastructure internally, so you know that there is a team of admins guaranteeing their five 9’s promise.


The Essence of Spring

This happened in Atlanta last week while I was in a Barnes & Noble bookstore. I circled around to the computer section and began scanning titles. With my head tilted I overheard a conversation about a job. I wasn’t actively listening but I knew one side was pitching a job while the other was inquiring about it.

A couple of minutes later it was just me and the guy who was looking for talent. I was sure he would start speaking. Soon after he said ‘so you’re in J2EE?’ and so the conversation began. He asked me about my work. He didn’t know about Interface21 but upon hearing it’s the company behind Spring his face lit. He said he hadn’t tried Spring yet and then added he was currently using Struts.


XPath Support in Spring Web Services

Following up on my post on WS-DuckTyping, I thought it would be interesting to show what support Spring Web Services offers for XPath. Some of these features are available right now, but most will be part of the RC1 release we will release later this month. Throughout this post I will be using the contacts xml file defined in item 35 of Effective XML, by Rusty Harold.


One of the options that has been available for quite a while is the XPathExpression. This is an abstraction over compiled XPath expressions, such as the Java 5 XPathExpression, and Jaxen XPath.


What Spring Web Flow Offers JSF Developers

Spring Web Flow, much like the Spring Framework itself, is a unique integration technology. Most of our users view it as a generic ApplicationController that can be embedded in any environment. We support Servlet and Portlet based applications, and ship integration with the leading web frameworks Struts, Spring MVC, and Java Server Faces. There are even teams I know of using Spring Web Flow in a Flex environment. In each of these environments, Spring Web Flow integrates to provide a better model for implementing navigation logic and managing application state.


Spring Project CI Builds

Over the last couple of weeks, fellow i21 employee Costin Leau and I have been working on improving the Continuous Integration processes of the Spring projects. When we started, we had separate builds running in Cruise Control, Continuum, and even a custom cron job. We were having some trouble getting any of our existing tools to give us what we wanted on all of the builds, when both Costin and I independently came upon Atlassian’s new product Bamboo.

In about 10 minutes we had the Spring CI build up and running. This might not sound like much, but due to its size Spring doesn’t play nicely with some build servers. So you can imagine our joy when the Spring build started kicking off reliably any time Juergen checked in a change. From there it was just a matter of setting up all the rest of the Spring projects to build as well. I’ve got to say, having done this kind of thing for a number years, I’ve never had CI builds start up so easily.


So what's the deal with Spring-OSGi?

Welcome to my blog!
This is my first entry…ever. I manage to resist the urge of blogging but since so many people encouraged me to write about what I do at i21 I decided to give it a go. This and the fact that the Spring-OSGi had its first release yesterday evening (EET time zone).

I’ve been involved with Spring-OSGi since August last year and it has been quite a ride. It’s one of the most challenging projects I have worked on and I’m glad to have it released, even as a milestone, to the public. Thanks a lot to everybody involved for making this happen, especially my team mates - Adrian, Andy and Hal!


Request-Reply JMS with Spring 2.0

Several months ago, I posted a blog entry introducing Spring 2.0’s support for Message Driven POJOs. While many people are now familiar with that feature, Spring 2.0’s JMS remoting features have received less attention. Essentially, this remoting functionality provides a JMS-based version of Spring’s general approach to remoting as exhibited in its support for RMI, Hessian/Burlap, and its own HttpInvoker.

For those unfamiliar with Spring remoting, the general idea is to configure a non-invasive exporter on the server-side and a proxy generator (a Spring FactoryBean) on the client-side.


BeanInitializer: wiring dependencies in unit tests

One of the things that irritates me the most about unit testing some classes in a Spring context, is initialising them with all their dependencies. This is especially true of Spring framework extensions, like FactoryBean implementations or *Aware implementations. It is cumbersome to add all the dependencies, and easy to forget to call the bean lifecycle methods, like the afterPropertiesSet method from InitializingBean.

The Spring base classes for unit testing help quite a lot, but there are still some things that are fiddly. E.g. in many cases it is necessary to disambiguate autowiring, so that collaborators are given the correct implementation. Also, to benefit from the lifecycle execution you have to be testing a bean instance from the current configuration, which isn’t always convenient.


Amsterdam Java Meetup scheduled for April 13th

Mark you calendars! In about two weeks, I’m hosting another Amsterdam Java Meetup; the quarterly event in the Netherlands where all people that have something to do with Java (but hey, we’re friendly; .NET guys are welcome too!) can have a chat and a drink. No technical sessions, no presentations, no keynotes, just drinks and chatting.

We have been organizing the Java Meetups for a while now and the attendance has grown from about 20 in December 2005 to about 60 or 70 last January.

So, spread the word and come join us (ah, and don’t forget, the first couple of rounds are paid for).