问题
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