How to Server Push when Event has occured?

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();
    }
}
fredand44Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

kiranhkCommented:
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
fredand44Author Commented:
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
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
JSP

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.