2017-04-10 71 views
1

我有以下EJB實現一個簡單的ActiveMQ消息入隊。 ActiveMQ代碼本身工作得很好。這部署在TomEE服務器上。@EJB批註導致servlet停止工作

package Beans; 

import javax.ejb.LocalBean; 
import javax.ejb.Stateless; 
import javax.jms.Connection; 
import javax.jms.ConnectionFactory; 
import javax.jms.Destination; 
import javax.jms.JMSException; 
import javax.jms.MessageProducer; 
import javax.jms.Session; 
import javax.jms.TextMessage; 
import org.apache.activemq.ActiveMQConnection; 
import org.apache.activemq.ActiveMQConnectionFactory; 

@LocalBean 
@Stateless 
public class SenderBean { 

    private ConnectionFactory factory = null; 
    private Connection connection = null; 
    private Session session = null; 
    private Destination destination = null; 
    private MessageProducer producer = null; 

    public SenderBean() { 

    } 

    public void sendMessage() { 

     try { 
      factory = new ActiveMQConnectionFactory(
        ActiveMQConnection.DEFAULT_BROKER_URL); 
      connection = factory.createConnection(); 
      connection.start(); 
      session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
      destination = session.createQueue("SAMPLEQUEUE"); 
      producer = session.createProducer(destination); 
      TextMessage message = session.createTextMessage(); 
      message.setText("Hello ...This is a sample message..sending from FirstClient"); 
      producer.send(message); 
      System.out.println("Sent: " + message.getText()); 

      connection.close(); 

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

我也有以下的類試圖在servlet來使用bean:

SenderBean類。如果我包含@EJB註釋(如以下示例中所示),則在接收到post後,servlet將引發異常。但是,如果我刪除了註釋並使用new SenderBean()實例化了bean類,那麼所有內容都可以正常工作。這可能是什麼原因?

SenderServlet類:

package Servlets; 

import Beans.ReceiverBean; 
import Beans.SenderBean; 
import javax.ejb.EJB; 
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 java.io.IOException; 

@WebServlet(name = "SenderServlet") 
public class SenderServlet extends HttpServlet { 

    @EJB 
    SenderBean senderBean; 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    senderBean.sendMessage(); 
    } 
} 

被接收到異常的HttpServletResponse一個500錯誤後:

HTTP Status 500 - Error instantiating servlet class Servlets.SenderServlet</h1><div class="line"></div><p><b>type</b> Exception report</p><p><b>message</b> <u>Error instantiating servlet class Servlets.SenderServlet</u></p><p><b>description</b> <u>The server encountered an internal error that prevented it from fulfilling this request.</u></p><p><b>exception</b></p><pre>javax.servlet.ServletException: Error instantiating servlet class Servlets.SenderServlet 
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97) 
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) 
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) 
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Thread.java:745) 

root cause javax.naming.NameNotFoundException: Name [Servlets.SenderServlet/senderBean] is not bound in this Context. Unable to find [Servlets.SenderServlet]. 
    org.apache.naming.NamingContext.lookup(NamingContext.java:816) 
    org.apache.naming.NamingContext.lookup(NamingContext.java:173) 
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97) 
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) 
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) 
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Thread.java:745) 

的爆炸神器: enter image description here

+0

請包括您正在使用的導入。 –

+0

你如何收拾你的應用程序? Servlet和EJB在相同的工件(WAR/EAR)中嗎? –

+0

@PaulWasilewski我在帖子中添加了爆炸的神器圖片。我的Java EE版本爲6. – user129186

回答

0

不要你有一個類路徑與activemq或休眠衝突?提供的庫不在WEB-INF/lib中?

相關問題