@MessageDriven bean not receiving messages

半城伤御伤魂 提交于 2019-12-11 19:34:30

问题


I made some changes per suggestions from another question to turn my class into a @Singleton rather than @Stateless, however I'm no longer receiving messages in my @MessageDriven Bean as I was before. Suggestions? Note that the topic is correctly defined in jbossmq-destinations-service.xml

@javax.ejb.Singleton(mappedName="MySingletonClass")
public class MySingletonClass implements SomeInterface
{
   private Timer timer = null;

   @javax.annotation.Resource
   TimerService timerService;


   /**
    * Creates the timer.
    */
   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
   public void resetTimer()
   {
      if (timer != null)
      {
         timer.cancel();
      }
      timer = timerService.createTimer(30000, "Note");
   }

   @Override
   public void readResponseMsg(Document responseXml)
   {
      resetTimer();
      //Do stuff
   }

   @Override
   @Timeout
   public void timeout() throws RemoteException
   {
       //do stuff
   }
}

and the MDB:

@javax.ejb.MessageDriven(mappedName = "jms/MyTopic", activationConfig = {
      @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
      @ActivationConfigProperty(propertyName = "destination", propertyValue = "MyTopic"),
      @ActivationConfigProperty(propertyName = "messagingType", propertyValue = "javax.jms.MessageListener"),
      @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
@ResourceAdapter("activemq.rar")
public class MyMDB implements MessageListener
{
   private static final Logger ourLogger = Logger.getLogger(MyMDB.class);

   @javax.ejb.EJB(mappedName="MySingletonClass") private MySingletonClassInterface reader;

   /**
    * @param message
    */
   public void onMessage(Message message)
   {
      TextMessage textMessage = (TextMessage) message;
      try
      {
         System.out.println("Received Message Text: " + textMessage.getText());
         reader.readResponseMsg(loadXMLFromString(textMessage.getText()));
      }
      catch (JMSException | SAXException | ParserConfigurationException | IOException e)
      {
         ourLogger.error("Exception handling Schedule Results Message", e);
      }
   }
}

This is the interface:

@javax.ejb.Local
public interface SomeInterface
{
   public void readResponseMsg(Document responseXml);


   public void timeout() throws RemoteException;
}

UPDATE I've been fiddling with some things and am now seeing some exceptions that at least indicate something is happening. I've updated the code above with my changes. This is my exception:

Caused by: javax.naming.NameNotFoundException: MySingletonClass not bound
    at org.jnp.server.NamingServer.getBinding(NamingServer.java:771) [:5.0.5.Final]
    at org.jnp.server.NamingServer.getBinding(NamingServer.java:779) [:5.0.5.Final]
    at org.jnp.server.NamingServer.getObject(NamingServer.java:785) [:5.0.5.Final]
    at org.jnp.server.NamingServer.lookup(NamingServer.java:396) [:5.0.5.Final]
    at org.jnp.server.NamingServer.lookup(NamingServer.java:399) [:5.0.5.Final]
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:728) [:5.0.5.Final]
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:688) [:5.0.5.Final]
    at javax.naming.InitialContext.lookup(InitialContext.java:411) [:1.7.0_25]
    at org.jnp.interfaces.NamingContext.resolveLink(NamingContext.java:1350) [:5.0.5.Final]
    ... 61 more

Also, further up in the JBoss 6 startup log, I am also seeing this:

 [BeanInstantiatorDeployerBase] Installed org.jboss.ejb3.instantiator.impl.Ejb31SpecBeanInstantiator@fbda95 into MC at org.jboss.ejb.bean.instantiator/mmpl/server/MySingletonClass

then a little further down the log:

DEPLOYMENTS MISSING DEPENDENCIES:
  Deployment "jboss-switchboard:appName=mmpl,module=server,name=MyMDB" is missing the following dependencies:
   Dependency "jboss.j2ee:ear=mmpl.ear,jar=server.jar,name=MySingletonClass,service=EJB3" (should be in state "Installed", but is actually in state "** NOT FOUND Depends on 'jboss.j2ee:ear=mmpl.ear,jar=server.jar,name=MySingletonClass,service=EJB3',whenRequired=MapControllerStateModel$ControllerStateWrapper@7ba014{Installed},dependentState=MapControllerStateModel$ControllerStateWrapper@7ba014{Installed} **")
  Deployment "jboss.j2ee:ear=mmpl.ear,jar=server.jar,name=MySingletonClass,service=EJB3_endpoint" is missing the following dependencies:
    Dependency "jboss.j2ee:ear=mmpl.ear,jar=server.jar,name=MySingletonClass,service=EJB3" (should be in state "Installed", but is actually in state "** NOT FOUND Depends on 'jboss.j2ee:ear=mmpl.ear,jar=server.jar,name=MySingletonClass,service=EJB3' **")

DEPLOYMENTS IN ERROR:
  Deployment "jboss.j2ee:ear=mmpl.ear,jar=server.jar,name=MySingletonClass,service=EJB3" is in error due to the following reason(s): ** NOT FOUND Depends on 'jboss.j2ee:ear=mmpl.ear,jar=server.jar,name=MySingletonClass,service=EJB3',whenRequired=MapControllerStateModel$ControllerStateWrapper@7ba014{Installed},dependentState=MapControllerStateModel$ControllerStateWrapper@7ba014{Installed} **, ** NOT FOUND Depends on 'jboss.j2ee:ear=mmpl.ear,jar=server.jar,name=MySingletonClass,service=EJB3' **

回答1:


I ended up abandoning the ejb singleton idea and using the following, which works perfectly:

public class MySingletonClass implements SomeInterface
{
   private ScheduledFuture<?> handle;
   private static ScheduledExecutorService executor;
   private static SomeInterface instance;

   public void readResponseMsg(Document responseXml)
   {
       resetTimer();
       //do stuff
   }

   /**
    * Creates the timer.
    */
   private void resetTimer()
   {
      if (handle != null)
      {
         handle.cancel(false);
      }
      handle = executor.schedule(this, 30l, TimeUnit.SECONDS);
   }


   /**
    * Initialize the static variables. Should only be called once per server
    * restart
    */
   private static void init()
   {
      try
      {
         executor = Executors.newSingleThreadScheduledExecutor();
         inited = true;
      }
      catch (Exception e)
      {
         ourLogger.error("Exception initializing ScheduleResultReader", e);
      }
   }

   public static SomeInterface getInstance()
   {
      if (instance == null)
      {
         instance = new MySingletonClass();
      }

      return instance;
   }

}


来源:https://stackoverflow.com/questions/18883021/messagedriven-bean-not-receiving-messages

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!