Posts

Showing posts from 2014

Implementing session timeout in playframework

According to play documentation "There is no technical timeout for the Session. It expires when the user closes the web browser. If you need a functional timeout for a specific application, just store a timestamp into the user Session and use it however your application needs (e.g. for a maximum session duration, maximum inactivity duration, etc.)."
So I used the following way to implement a session timeout. Following custom authenticator class was used to implement this.
public class ValidateUserSessionAction extends Security.Authenticator{ @Override public String getUsername(Http.Context ctx) { long currentTime=System.currentTimeMillis(); long timeOut=Long.parseLong(Play.application().configuration().getString("sessionTimeout")) * 1000 * 60; String temp=ctx.session().get(Constants.LAST_SEEN_KEY); if (temp == null) { temp = String.valueOf(currentTime); } if((currentTime-Long.parseLong(temp))<…

Optimizing Apache Storm deployment

Recently we happen to run some pretty large Storm topologies in a Storm cluster which runs on Linux. When we running it there were two main issues occurred due to system limitations. First one was logged in Storm logs as,
“java.lang.OutOfMemoryError : unable to create new native Thread”.


We fixed this problem by increasing the Ulimit for Storm. Usually storm spawns processes with an user named Storm. So we have to increase the Ulimit for storm user. You can see the ulimits using command "ulimit -u". To increase the ulimits you can follow an approach like this.
The second problem was communication link failures between Storm nodes as well as communication link failures between other services (e.g. external APIs, databases, etc). To resolve this problem we had to enable tcp time wait reuse and also we increased the port range for tcp. hat can be done in following manner.
 Put these to /etc/sysctl.conf file and issue 'sysctl -f'
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.i…

Introduction to Play-Framework modules

Play framework inherently support modularization. In other words we can develop play modules and reuse them in different play applications. This article provides a good guide on how to do that. But that is little bit outdated for latest Play distributions. I will describe the changes which is needed to be done to create a play module on latest play versions.
Playframework no longer has a play console. Instead of that it uses Typesafe activator. So you need to download activator and add activator to your environment path.
You can create boilerplate code for a play app using the  template called Just play java. In my case I needed to create a authentication module. So I created a Play action called auth in controllers package. Then to publish the module go the project directory and issue clean command. Then issue publish-local command. If it is successful you will get a output like this.

[info] published ivy to /home/prabhath/.ivy2/local/authmodule/authmodule_2.10/1.0-SNAPSHOT/ivys/ivy.x…

Add a attachment to CouchDB with play framework JavaAPI

I tired to write a rest API which act as a mediator between clients and CouchDB API. This was done using Playframework's Java API. I wrote the following controller method which takes a POST request which contains file name, content-type and file to be stored as parameters and send as a PUT request to CouchDB.


public static Result putAttachment(){ Http.MultipartFormData body = request().body().asMultipartFormData(); Http.MultipartFormData.FilePart picture = body.getFile("picture"); String fileName=null; String contentType=null; File file=null; if (picture != null) { fileName = picture.getFilename(); contentType = picture.getContentType(); file = picture.getFile(); } else { //TODO implement } String restServiceUrl = "http://127.0.0.1:5984/test/a/"+fileName; F.Promise<play.libs.WS.Response> future =play.libs.WS.url(restServiceUrl…

Fixing Error "Failed to load VMMR0.r0 (VERR_SUPLIB_WORLD_WRITABLE)" in Virtualbox

Recently I  to installed Oracle Virtualbox on my Ubuntu 12.04 computer to run Hortanworks sandbox. When I am trying to start the Sanbox it gave me an error like this.

Failed to load VMMR0.r0 (VERR_SUPLIB_WORLD_WRITABLE).
Unknown error creating VM (VERR_SUPLIB_WORLD_WRITABLE).

What it says is /usr/bin forlder is world writable. Usually this is not world writable. But somehow I have unintentionally changed the permissions. I fixed this using the following command.

chmod o-w /usr/bin

Integrating an Akka.io actor system with Play framework (A distributed message classifier with Akka.io and Play framework)

Image
Recently we developed a distributed message classifier. This can process rapid burst of text (email, twitter feeds, etc) and get results.


To implement the processing part we used Akka.io which is an event based distributed framework. Currently to analyse messages we use a web service. But any other processing mechanism (local or remote) can be easily plugged to this. After implementing the core we needed to publish messages to the applications using REST. To do that we integrated it with Play Framework. Also I developed an admin panel using MVC features provided by it. While integrating the existing actor system with play framework several conflicts occurred. One reason for this was Play framwork internally uses an actor system too. So I had to do several tweaks and change some configurations. I am not going to discuss each of them here because it will be too lengthy. This is the URL to our git-hub repo https://github.com/Buddhima/MessageClassifier. You can fork it and see those by y…