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