2016-10-11 7 views
1

以下のコードを参照してください。メッセージ - 連続ループ

package com.w0051977.dao; 

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; 
import com.w0051977.model.Student; 

/** 
* 
* @author 
*/ 
@MessageDriven(activationConfig = { 
    @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/StudentMessage"), 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") 
}) 
public class StudentMessage implements MessageListener { 

    @Resource 
    private MessageDrivenContext mdc; 
    @PersistenceContext(unitName = "CRUDWebAppPU") 
    private EntityManager em; 



    public StudentMessage() { 
    } 

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

    public void save(Object object) { 
     em.persist(object); 
    } 

} 

私は、このクラスを追加し、Netbeansの7.4にGlassFishサーバーを再起動します。 Glassfishログは、OnMessageが連続ループで実行されていることを示し、Netbeansがクラッシュするまで実行を続けます。 Studentオブジェクトには、このサーブレットからフィードされる値が含まれています。

package com.w0051977.controller; 

import java.io.IOException; 
import java.io.PrintWriter; 
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.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import com.w0051977.model.Student; 

/** 
* 
* @author 3212627 
*/ 
@WebServlet(name = "ServletAddStudentMessageBean", urlPatterns = {"/ServletAddStudentMessageBean"}) 
public class ServletAddStudentMessageBean extends HttpServlet { 

    /** 
    * 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 
    */ 

    @Resource(mappedName="jms/StudentMessageFactory") 
     private ConnectionFactory connectionFactory; 

     @Resource(mappedName="jms/StudentMessage") 
     private Queue queue; 

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 

     response.setContentType("text/html;charset=UTF-8"); 
      try { 
       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 
       Student s1 = new Student(); 
       s1.setFirstName("Fred"); 
       s1.setLastName("Bloggs"); 
       s1.setYearLevel(3); 

       message.setObject(s1);     
       messageProducer.send(message); 
       messageProducer.close(); 
       connection.close(); 
       response.sendRedirect("StudentInfo"); 

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

      PrintWriter out = response.getWriter(); 

      out.println("Servlet PostMessage at " + request.getContextPath() + "</h1>"); 

    // The following code adds the form to the web page 
    out.println("<form>"); 
    out.println("Title: <input type='text' name='title'><br/>"); 
    out.println("Message: <textarea name='body'></textarea><br/>"); 
    out.println("<input type='submit'><br/>"); 
    out.println("</form>"); 

    out.println("</body>"); 


     } 

     // <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> 

    } 

なぜ連続ループがありますか?私はサーブレットを削除していますが、依然としてループが継続しているようです。

答えて

0

私はMDBに同様の問題がありました。私はQueueのルックアップを行うことを解決しました。実際には、

@Resource(lookup="jms/StudentMessage") 
でライン

@Resource(mappedName="jms/StudentMessage") 

を変更しようと

関連する問題