Solved

How to Server Push when Event has occured?

Posted on 2004-10-26
410 Views
Last Modified: 2008-02-01
X Hello!

Does anyone got a better solution for this?

What I need to create is a servlet that uses Server side Push/Server sid Reload. When something happens a page should be reloaded.

Suppose that you got a visit counter at a page in a browser and if that counter is updated from an other page in an other browser all other page in all browsers with that counter needs to be updated.

I have created a ugly hack that produce this, but I'm not satisfied with it. My hack does a file access every second and I do not want that.

What I would like is some Listener that listens if perhaps the file is changed or some other Event has occur on the server side but I do not know if that is possible.

Below is my ugly hack divided in 2 Servlets. My FileManager just reads a number from a file, nothing magic.

So if any one got a nice solution please let me know!

BTW Server side Push doesn't work in Internet Explorer I use a old NetScape at Linux Mandrake 8.0 that works fine. I have heard that it is possible with FireFox as well.

Best regards
Fredrik

The servlets that checks for changes:

package my.servlets;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

import my.servlets.*;
import my.tools.*;

import com.oreilly.servlet.*;
import com.oreilly.servlet.multipart.*;

public class ServerReload extends GeneralServlet
{
    public void start(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        ServletOutputStream out = response.getOutputStream();
        MultipartResponse multi = new MultipartResponse(response);

        int counter = 0;
        while(counter < 100)
        {
            String output = FileManager.getStringFor("counter.txt");
            int tempCounter = Integer.parseInt(output);

            if(counter != tempCounter)
            {
                multi.startResponse("text/plain");
                counter = tempCounter;
                out.println(counter);
                multi.endResponse();
            }

            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
            }
        }
        multi.finish();
        out.close();
    }
}


The servlet that updates the counter.txt file:

package my.servlets.assignments1;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

import my.servlets.*;
import my.tools.*;

public class SecureFileAccess extends GeneralServlet
{
    public void start(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        response.setContentType("text/plain");
        out = new PrintWriter(response.getOutputStream());

        String output = null;
        synchronized(this)
        {
            try
            {
                output = FileManager.getStringFor("counter.txt");
                int counter = Integer.parseInt(output);
                output = ""+(++counter);
                FileManager.writeString("counter.txt", output, false);
            }
            catch(Exception e)
            {
                output = "1";
                FileManager.writeString("counter.txt", output, false);
            }
        }

        printString(output);
        flush();
    }
}
0
Question by:fredand44
    2 Comments
     
    LVL 8

    Accepted Solution

    by:
    0
     

    Author Comment

    by:fredand44
    Hello Mates!
    I solved it like this, not the best way but I guess that it will work.

    public class ServerReload_1g extends GeneralServlet implements HttpSessionAttributeListener
    {
          static boolean send = false;

          public void start(HttpServletRequest request, HttpServletResponse response) throws IOException
          {
                ServletOutputStream servletOutputStream = response.getOutputStream();
                MultipartResponse multipartResponse = new MultipartResponse(response);

                send = true;

                int counter = 0;

                while(counter < 100)
                {
                      if(send)
                      {
                            String output = FileManager.getStringFor("applications/int_2/int_2/templates/1a.txt");
                            counter = Integer.parseInt(output);
                            multipartResponse.startResponse("text/plain");
                            servletOutputStream.println(counter);
                            multipartResponse.endResponse();
                            send = false;
                      }

                      try
                      {
                            Thread.sleep(1000);
                            counter++;
                      }
                      catch (InterruptedException e)
                      {
                      }
                }
                multipartResponse.finish();
                servletOutputStream.close();

          }

          public void attributeAdded(HttpSessionBindingEvent se)
          {
                send = true;
          }

          public void attributeRemoved(HttpSessionBindingEvent se)
          {
          }

          public void attributeReplaced(HttpSessionBindingEvent se)
          {
          }
    }


    public class SecureFileAccess_1a extends GeneralServlet
    {
          public void start(HttpServletRequest request, HttpServletResponse response) throws IOException
          {
                response.setContentType("text/plain");
                out = new PrintWriter(response.getOutputStream());

                String output = null;
                synchronized(this)
                {
                      try
                      {
                            output = FileManager.getStringFor("applications/int_2/int_2/templates/1a.txt");
                            int counter = Integer.parseInt(output);
                            output = ""+(++counter);
                            FileManager.writeString("applications/int_2/int_2/templates/1a.txt", output, false);
                      }
                      catch(Exception e)
                      {
                            output = "1";
                            FileManager.writeString("applications/int_2/int_2/templates/1a.txt", output, false);
                      }
                }

                //Just notify the listener in ServerReload_1g that we have updated the counter
                session.setAttribute("ServerReload_1g", "ServerReload_1g");
                session.removeAttribute("ServerReload_1g");
                //It is possible to work around the listeners with using the static variable send direct.
                //ServerReload_1g.send = true;

                printString(output);
                flush();
          }
    }

    Thanks for your time!
    Fredrik
    0

    Write Comment

    Please enter a first name

    Please enter a last name

    We will never share this with anyone.

    Featured Post

    Course: From Zero to Hero with Nodejs & MongoDB

    Interested in Node.js, but don't know where to start or how to learn it properly? Confused about how the MEAN stack pieces of MongoDB, Expressjs, Angularjs, and Nodejs fit together? Or how it's even possible to run JavaScript outside of the browser?

    Before we dive into the marketing strategies involved with creating an effective homepage, it’s crucial that EE members know what a homepage is. In essence, a homepage is the introductory, or default page, of a website that typically highlights the …
    I recently attended Cisco Live! in Las Vegas, a conference that boasted over 28,000 techies in attendance, and a week of hands-on learning hosted by a solid partner with which Concerto goes to market.  Every year, Cisco displays cutting-edge technol…
    Want to pick and choose which updates you receive? Feel free to check out this quick video on how to manage your email notifications.
    Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…

    846 members asked questions and received personalized solutions in the past 7 days.

    Join the community of 500,000 technology professionals and ask your questions.

    Join & Ask a Question

    Need Help in Real-Time?

    Connect with top rated Experts

    7 Experts available now in Live!

    Get 1:1 Help Now