We’re using Quartz to handle scheduled jobs in our java applications. Since we cluster our apps for failover using Terracotta, we need to address the issue of how to failover scheduled jobs (we only want each job to execute exactly once, but for fault tolerance it should be scheduled on multiple servers). Quartz handles this situation with clustered job stores and Terracotta provides a job store for Quartz. Its easy to use – just add the quartz-terracotta jar (you’ll also need a quartz version > 1.7 – I’m using 1.8.4 below). [sourcecode language=”xml”] org.quartz-scheduler quartz 1.8.4 org.terracotta.quartz quartz-terracotta 1.2.0 [/sourcecode] then set two systems properties. I’m doing it programmatically below because I use a commandline option to enable clustering in[…]

A while back we installed a new Dell server with a low-power Xeon 3GHz L3110 CPU to run some other essential network infrastructure. We chose the specific server configuration because it dissipates less than 30W while running 5 VMware VMs. It runs for hours on a UPS and doesn’t require cooling, so even if our server room air-conditioning were to die, this server should keep our network, firewalls, VPNs, DNS, DHCP and primary Terracotta server and a few other vital services up long enough for us to figure out what’s going on. The server is running CentOS 5.5 and VMWare 1.0.10 – normally a very stable combination. However, we found that Linux guests running on this server were not keeping[…]

Hazelcast (hazelcast.com) provides an easy way to implement distributed locking to allow your applications to run multiple, fault-tolerant instances without worrying about issues related concurrent access to shared resources (like files, databases or whatever). [sourcecode language=”java”] try { java.util.concurrent.locks.Lock lock = Hazelcast.getLock(“mylock”); while (true) { lock.lock(); try { // do some work involving access to shared resources } finally { lock.unlock(); } } } finally { Hazelcast.shutdown(); } [/sourcecode] We have an SMS server which retrieved mail messages from a POP3 mailbox, entered them to a database and then delivered via the Clickatell messaging gateway. Making it run multiple instances concurrently would have been a headache since it would involve various issues relating to transactions across the POP3 and the[…]

Sometimes you have a class containing an id of another (lets say a Machine class containing an owner id rather than an Owner object). The owner id is actually a primary key from the Owner table in the database. Now you want to display the Machine class in a wicket form with a dropdown to select the Owner. In an ideal world, your Machine class would have “Owner getOwner()” and “setOwner (Owner owner)” methods and your MachineService class would have a static “List getOwners()” method and wicket’s DropDownChoice would just work with: [sourcecode language=”java”] final Form form = new Form(“form”, new CompoundPropertyModel(machine)); add(form); form.add(new DropDownChoice(“owner”, MachineService.getOwners())); [/sourcecode] However, in our Machine class, the owner property is an id of an[…]

In Wicket when you want to require user login for some pages, you typically inherit the pages from a superclass called say ProtectedPage and then use a wicket SimplePageAuthorizationStrategy to protect these pages as follows: [sourcecode language=”java”] getSecuritySettings().setAuthorizationStrategy(new SimplePageAuthorizationStrategy(ProtectedPage.class, LoginPage.class) { @Override protected boolean isAuthorized() { return ((ApplicationSession) Session.get()).getLoggedInUser() != null; } }); [/sourcecode] This will cause any access to a protected page by a non-logged-in user to be redirected to the login page first. In the real world, its likely however, that your application will also require administrator privileges for access to certain pages. To do this, you need to use a wicket CompoundAuthorizationStrategy as follows: [sourcecode language=”java”] CompoundAuthorizationStrategy pageAuthorizationStrategy = new CompoundAuthorizationStrategy(); pageAuthorizationStrategy.add(new SimplePageAuthorizationStrategy(AdminPage.class, AccessDeniedPage.class) { @Override protected[…]

I recently used embedded Jetty for a small REST server project and it was a revelation. It took exactly no time to get it running and now I can deploy web-apps just by starting a runnable jar. That’s reason enough – no more Tomcat with all the complexity of sharing a single server amongst multiple apps, but, even more importantly, its wonderful for development. No more fooling around with Tomcat in Eclipse – just debug web-apps directly as a Java application. We run all of our apps as multiple instances behind a load-balancer (HAProxy), so its convenient to run each app on a separate port and let the load-balancer handle the forwarding from port 80.

Christoph has spent the last couple of weeks refactoring a web project to use IBATIS instead of Hibernate. I also refactored a smaller project to use IBATIS instead of JDBC. Here’s our take on the issues: If you like JDBC and PreparedStatements, you’ll feel comfortable with IBATIS. It doesn’t force any major changes on you and reduces the lines of boilerplate code you’ll need for your database access. It has other benefits as well, such as automatically handling boolean and date mappings which are tedious and error-prone in JDBC. We had successfully used Hibernate in a number of other projects, but in this particular project, Hibernate turned out to be an awkward fit. The problem was that we already had[…]

Here’s something I had to piece together myself from various code fragments. Its a class to authenticate a user in Windows Active Directory environment using LDAP. It first locates the domain controllers (DNS lookup of SRV records for _ldap._tcp.domain), parses out the server part and then tries to authenticate the user against a domain controller. [sourcecode language=”java”] import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import javax.naming.AuthenticationException; import javax.naming.CommunicationException; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import com.sun.jndi.ldap.LdapCtxFactory; /** * LDAPAuthentication class for authenticating Microsoft Active Directory users * * If the user or password is wrong, you’ll get an AuthenticationException If * none of the domain controllers are reachable, you’ll get a * CommunicationException. If a[…]

Sometimes its useful in an application to have a list of users who are currently logged onto an application on a server. To do this, you first need a SessionAttributeListener which listens for attributes being added to and removed from the session:

Then from within your application login, you can set a session attribute when a user logs on

You don’t need to remove the attribute on logout, as long as you are invalidating the session – this will automatically remove the attribute and invoke the attributeRemoved method of the listener. The final step is to add an activity monitor display to your application which calls SessionAttributeListener.getActiveUsers() and displays the list.

For someone starting out with Wicket, it can be tricky to figure out basic things like how to display images. Here are basic three scenarios: 1. Simple fixed image – no wicket code required: HTML:

This is fine as long as you don’t need any control over the image. 2. Image set from code: HTML:

JAVA:

The ContextRelativeResource method here tells wicket to load the image from the images folder in your application (the same path as used in the relative src attribute used in the simple HTML example 1). 3. Image set using CSS: HTML:

CSS:

This approach is preferred for images which are really only part of the styling of the application (like[…]