Wednesday, June 9, 2010

Load Balancing and Clustering Liferay

There are two ways of Clustering Liferay on Tomcat
1. Sticky Session
User request will always goes to same Liferay instance
2. Session Replication
User request can go to any tomcat in cluster and his session is copied on entire cluster




Lets get started for Sticky Session based clustering and load balancing.


Use-Case
Setting up two tomcat Liferay along with apache on same windows machine.


Pre-requirements
1. install Apche 2.x
2. download Liferay5.x and make an extra copy


Steps 1. open httpd.conf from apache_home/conf/ and add these lines at the end



BalancerMember ajp://localhost:8009/ route=tomcatA smax=15 max=50 loadfactor=20
BalancerMember ajp://localhost:8010/ route=tomcatB smax=15 max=50 loadfactor=20




ProxyPass balancer://mycluster/ stickysession=JSESSIONID




SetHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from localhost



Step 2.


uncomment the following four lines on httpd.conf


LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule status_module modules/mod_status.so


Step 3.


open liferay/tomcat_home_1/conf/server.xml and add jvmRoute="tomcatA" to the following line


Engine name="Catalina" defaultHost="localhost"


so it should look like this
Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA"


Step 4.


open liferay/tomcat_home_2/conf/server.xml and add jvmRoute="tomcatB" to the following line


Engine name="Catalina" defaultHost="localhost"


so it should look like this
Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB


also change the following port nos




Server port="8006" shutdown="SHUTDOWN"


Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8444"


Connector port="8010" protocol="AJP/1.3" redirectPort="8444"


Thats It!


start apache, tomcatA, tomcatB and


navigate to http://localhost/
also checkout balancer-manager
http://localhost/balancer-manager


for more configuration and understanding checkout the following link
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html





If your tomcats run on different server make sure you change index directory to some central place (e.g /common-dir/liferay ) i.e resource.repositories.root=/common-dir/liferay in portal-ext.properties


An Important Liferay article

http://www.liferay.com/web/guest/community/wiki/-/wiki/Main/Clustering

Wednesday, April 28, 2010

liferay performance tuning


Performance Improvement ways in liferay

a) Memory - garbage collection thru Admin interface

b) Parameters to JVM while starting tomcat
-Xms128m -Xmx1024m -XX:MaxPermSize=128m

c) DBCP instances - increase it in ROOT.xml

d) Properties file changes
last.modified.check=false
theme.css.fast.load=true
javascript.fast.load=true

e) Servlet Filters

Total of 15 filters. Disable the ones that are not required. eg.

CompressionFilter
StripFilter

Open web.xml and comment the entries for these filters.

Similarly for,

CASFilter
NtlmFilter
VirtualHostFilter

The fewer servlet filters you are running, the less processing power is needed.

f) Portlet

Edit the following files to disable certain portlets from getting deployed to the portal server.

portlet.xml
liferay-portlet.xml

Restart the server

g) Database design

Ensure all the search colums are indiced properly.
Do periodic house-keeping on the database indices.
Proper design of the database tables keeping in mind the normalization techniques.

h) Get the cache-ing enabled for database objects.

By default only the User_ table is cached. Cache other tables as well that will be frequenly accessed.

Refer to the place where you can do this setting.

i) Application Layer

Write your code in such a way that you make lesser database / hibernate calls.

Remember, every call to the persistence layer is going to take time. So be very careful using them. Never use persistence layer calls inside loops.

Write optimized queries when you put them in custom-sql files.

j) UI design

place fewer portlets on a portal page.

when you use images / flash objects make sure that they are very small.

If you write custom css / javascript compress them using YUI compressor so that they get downloaded to the browser pretty fast.

Replace Tinymce in the place of FCKEditor.

k) Setting logging mode to ERROR.

Tuesday, February 10, 2009

Creating and importing properties into java file

step 1)

create a property file with name Conn.Properties having example property
bvmc.LoginURL=manish
bvdb.url = jdbc:oracle:thin:



step 2)
write the following java code

private static final Properties CONNPRP = new Properties();

static {

try {

FileInputStream fileInputStream = new FileInputStream(
"config/Conn.Properties");
CONNPRP.load(fileInputStream);

} catch (Exception e)
{
throw new RuntimeException(e);
}
}


String loginURL = CONNPRP.getProperty("bvmc.LoginURL");

System.out.println("loginURL :::::: " + loginURL);

***** How to create mail functionality in java *****

We just need mail.jar imported into our Eclipse project for this mail functionality.

package Mail;


import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MailManager {
private static Properties properties = System.getProperties();

static {
String mailhost = "relay.company.com";

properties.put("mail.smtp.host", mailhost);
properties.put("mail.mime.charset", "utf-8");
}

public static void main(String[] args) throws Throwable {
try {
// System.out.println("Start-----------");
// String userName = "Vikas";
// String from = userName + "@gmail.com";
// String to = "manish.kr.jaiswal@gmail.com";
// String body = "This is the body";
// String subject = "TestSubject";
// sendEmail(from, to, body, subject);
// System.out.println("Start-----------2");
} catch (Throwable th) {
th.printStackTrace();
throw th;

}
}

public static void sendEmail(String from, String to, String body,
String subject) throws MessagingException, AddressException {
Session session = Session.getInstance(properties, null);

Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));

message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(
to, false));

message.setSubject(subject);
message.setContent(body, "text/html; charset=utf-8");
// message.setText(body);// , "text/html;
Transport.send(message);
}
}

Sunday, February 8, 2009

**** Using JSON in JavaScript. *****

JSON Simply is a way of representation of data and its access and this is by default supported by javascript

JSON is a subset of the object literal notation of JavaScript. Since JSON is a subset of JavaScript,
it can be used in the language with no muss or fuss.

var myJSONObject = {"bindings": [
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
{"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
{"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
]
};


Members can be retrieved using dot or subscript operators.

myJSONObject.bindings[0].method // "newURI"

To convert a JSON text into an object, you can use the eval() function. eval() invokes the JavaScript compiler. Since JSON is a proper subset of JavaScript, the compiler will correctly parse the text and produce an object structure. The text must be wrapped in parens to avoid tripping on an ambiguity in JavaScript's syntax.

var myObject = eval('(' + myJSONtext + ')');

Thursday, February 5, 2009

1) Ajax made Simple

Ajax in Simple steps.............ENJOYYYYYYYYY

Basically there are 3 things to be understood in Ajax

1) we have a request state that tells the request state after its being sent from AJAX/javascript code

State Description
0 The request is not initialized
1 The request has been set up
2 The request has been sent
3 The request is in process
4 The request is complete

2) A function is being called at every state of request .

xmlHttp.onreadystatechange=function()
{
if(xmlHttp.readyState==4)
{
// Get the data from the server's response
}
}

4) Get the data from the server's response

xmlHttp.responseText

Now Before all these we need 2 things more

1) get XMLHttpRequest object (its an ActiveXObject ).

2) send the request using
xmlHttp.open("GET","time.asp",true);
xmlHttp.send(null);

2) JOB SCHEDULING USING QUARTZ IN JAVA

An easy example for JOB scheduling

class 1 MainApplication :-




import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import org.apache.catalina.util.URLEncoder;


class MainApplication {

public static void main(String[] args) {
Timer timer = new Timer();
Calendar date = Calendar.getInstance();
date.set(
Calendar.DAY_OF_WEEK,
Calendar.WEDNESDAY
);
date.set(Calendar.HOUR, 5);
date.set(Calendar.MINUTE,0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);

// Schedule to run every Sunday in midnight
timer.schedule(
new ReportGenerator(),
date.getTime(),
1000 * 60 * 60 * 24 * 7
);

}
}


class 2 ReportGenerator :-



import java.util.TimerTask;


public class ReportGenerator extends TimerTask {

public void run() {
System.out.println("This is VIKASSSSSSSSSSSSSSSSSSSSSSSS:: ");
//TODO generate report
}

}

---------------------------------------------------------------