users@glassfish.java.net

glassfish infinitly repeats tries to insert to database

From: <glassfish_at_javadesktop.org>
Date: Fri, 20 Mar 2009 02:45:47 PDT

I wrote simple ejb and web face that get file from http-form and insert it into BLOB in mysql database.
When I accidentally gave it an bigger file that can be inserted into BLOB, glassfish infinitly tried to insert this data into DB consuming CPU at 100%. Even restart isn't helpful: when glassfish loads my ejb it tries to insert this data again... How can I tell glassfish not to try again?

PS Sorry for big post...

My ejb:

blobEntity class:

[code]
package ejb;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 *
 * @author root
 */
@Entity
public class blobEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private byte[] imgData;

    public byte[] getImgData() {
        return imgData;
    }

    public void setImgData(byte[] imgData) {
        this.imgData = imgData;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof blobEntity)) {
            return false;
        }
        blobEntity other = (blobEntity) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "ejb.blobEntity[id=" + id + "]";
    }

}
[/code]

blobMessageBean class:

[code]

package ejb;

import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author root
 */
@MessageDriven(mappedName = "jms/blobMessage", activationConfig = {
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class blobMessageBean implements MessageListener {

    @Resource
    private MessageDrivenContext mdc;
    @PersistenceContext
    private EntityManager em;

    public blobMessageBean() {
    }

    public void onMessage(Message message) {
        ObjectMessage msg = null;
        try {
            if (message instanceof ObjectMessage) {
                msg = (ObjectMessage) message;
                blobEntity e = (blobEntity) msg.getObject();
                save(e);
            }
        } catch (JMSException e) {
            e.printStackTrace();
            mdc.setRollbackOnly();
        } catch (Throwable te) {
            te.printStackTrace();

        }
    }

    public

     void save(Object object) {
        em.persist(object);
    }
}
[/code]

(facade for blobEntity is standart, i not change anything)

blobEntityFacade class:
[code]

package ejb;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author root
 */
@Stateless
public class blobEntityFacade implements blobEntityFacadeLocal {
    @PersistenceContext
    private EntityManager em;

    public void create(blobEntity blobEntity) {
        em.persist(blobEntity);
    }

    public void edit(blobEntity blobEntity) {
        em.merge(blobEntity);
    }

    public void remove(blobEntity blobEntity) {
        em.remove(em.merge(blobEntity));
    }

    public blobEntity find(Object id) {
        return em.find(blobEntity.class, id);
    }

    public List<blobEntity> findAll() {
        return em.createQuery("select object(o) from blobEntity as o").getResultList();
    }

}
[/code]

blobEntityFacadeLocal class:
[code]
package ejb;

import java.util.List;
import javax.ejb.Local;

/**
 *
 * @author root
 */
@Local
public interface blobEntityFacadeLocal {

    void create(blobEntity blobEntity);

    void edit(blobEntity blobEntity);

    void remove(blobEntity blobEntity);

    blobEntity find(Object id);

    List<blobEntity> findAll();

}
[/code]
And at last servlet that adds blob:
[code]
package web;

import ejb.blobEntity;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.Session;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 *
 * @author root
 */
public class AddImage extends HttpServlet {

    @Resource(mappedName = "jms/blobMessageFactory")
    private ConnectionFactory connectionFactory;
    @Resource(mappedName = "jms/blobMessage")
    private Queue queue;
    DiskFileItemFactory factory;

    @Override
    public void init() throws ServletException {
        super.init();
        factory = new DiskFileItemFactory();
    }

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String ct = request.getContentType();
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if (isMultipart) {
            try {
                ServletFileUpload upload = new ServletFileUpload(factory);
                List items = null;
                try {
                    items = upload.parseRequest(request);
                } catch (FileUploadException ex) {
                    Logger.getLogger(AddImage.class.getName()).log(Level.SEVERE, null, ex);
                }
                Iterator iter = items.iterator();
                // получили список всех полей из html-формы
                boolean done = false;
                FileItem item = null;
                while (iter.hasNext() && (!done)) {
                    item = (FileItem) iter.next();
                    done = !item.isFormField();
                }
                if (done) {
                    // если файл
                    // так мы получим значение оригинального имени файла
                    String name = item.getName();
                    long filelen = item.getSize();
                    // так мы определим его размер
                    // а так мы определим его content-type
                    String cct = item.getContentType(); // а теперь нужно что-то сделать с самим содержимым файла ....
                    Connection connection = connectionFactory.createConnection();
                    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
                    MessageProducer messageProducer = session.createProducer(queue);

                    ObjectMessage message = session.createObjectMessage();
                    // here we create NewsEntity, that will be sent in JMS message
                    blobEntity e = new blobEntity();
                    e.setImgData(item.get());
                    message.setObject(e);
                    messageProducer.send(message);
                    messageProducer.close();
                    connection.close();
                    response.sendRedirect("AddImage");



                }//else если это обычное текстовое поле, а не файл


            } catch (JMSException ex) {
                ex.printStackTrace();
            }
        }


        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet AddImage</title>");
            out.println("<h1>" + ct + "</h1>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet AddImage at " + request.getContextPath() + "</h1>");
            out.println("<form action=\"AddImage\" method=\"post\" enctype=\"multipart/form-data\">");
            out.println("File to upload: <input name='data' type='file'><br/>");
            out.println("<input type='submit'><br/>");
            out.println("</form>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }

    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
[/code]
[Message sent by forum member 'argos' (argos)]

http://forums.java.net/jive/thread.jspa?messageID=338095