Hello,
I've implemented an embedded activemq service and a message listener using
in activemq 5.7.0. It works fine for a few hours but I've noticed that
after a day or two of inactivity messages stop getting consumed and I keep
getting the following message in the logs:
16:19:01,627 DEBUG [AbstractInactivityMonitor] WriteChecker 10000 ms
elapsed since last write check.
16:19:01,627 DEBUG [AbstractInactivityMonitor] Running
WriteCheck[tcp://my.ip.addr:61616]
16:19:11,624 DEBUG [AbstractInactivityMonitor] WriteChecker 10000 ms
elapsed since last write check.
16:19:11,625 DEBUG [AbstractInactivityMonitor] Running
WriteCheck[tcp://my.ip.addr:61616]
16:19:11,627 DEBUG [AbstractInactivityMonitor] WriteChecker 10000 ms
elapsed since last write check.
16:19:11,627 DEBUG [AbstractInactivityMonitor] Running
WriteCheck[tcp://my.ip.addr:61616]
It looks like my connection becomes inactive after awhile and messages get
stuck in the queue. I can see in netstat the several ports
remain occupied but messages are not dequeued.
Here's what my embedded service looks like (implemented as a servlet in
tomcat):
public void init(ServletConfig config) throws ServletException {
super.init(config);
logger.info("Initializing message queue listener");
try {
BrokerService broker = new BrokerService();
TransportConnector connector = new TransportConnector();
connector.setUri(new URI("tcp://localhost:61616"));
broker.addConnector(connector);
broker.setPersistent(false);
broker.getSystemUsage().getTempUsage().setLimit(2000);
broker.start();
EntityXMLConsumer.startInstance(); /this is the listener
} catch (Exception e) {
logger.error(e);
}
}
And here's my listener.
public class EntityXMLConsumer implements MessageListener,
ExceptionListener{
private static Logger logger = Logger.getLogger(EntityXMLConsumer.class);
private static ConfigManager configManager = ConfigManager.getInstance();
private static String url =
configManager.getProperty("popworkflowsvc.activemq.url");
//private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;
private static String subject = "WORKFLOW";
private static Session session;
private MessageConsumer consumer;
private static Connection connection;
private static EntityXMLConsumer instance = null;
private EntityXMLConsumer() throws JMSException{
logger.info("Initializing message listener on url :" + url);
ActiveMQConnectionFactory connectionFactory = new
ActiveMQConnectionFactory(url);
connection = connectionFactory.createConnection();
// to use transactions you should set the first parameter to
'true'
session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(subject);
consumer = session.createConsumer(destination);
consumer.setMessageListener(this);
connection.start();
}
public static EntityXMLConsumer startInstance() throws JMSException {
if (instance == null){
instance = new EntityXMLConsumer();
}
return instance;
}
public static void closeConnection() {
try {
logger.info("closing connection");
connection.close();
} catch (JMSException e) {
logger.error(e);
}
}
public void onException(JMSException ex) {
logger.error(ex);
closeConnection();
}
public void onMessage(Message message) {
final String MSG_ID = "ENTITY_DATA";
PopWorkflowServiceSEI service = new PopWorkflowServiceImpl();
try {
logger.info("message received: " + message );
if (message instanceof MapMessage){
MapMessage mapMessage = (MapMessage) message;
Map payloadMap = (Map)mapMessage.getObject(MSG_ID);
for (Object messageKey: payloadMap.keySet()){
logger.info("Module ID: " + messageKey);
Object[] entityXML = ((List)(payloadMap.get(messageKey))).toArray();
String[] strEntityXML = Arrays.copyOf(entityXML, entityXML.length,
String[].class);
service.initWorkflow(strEntityXML , (String)messageKey);
logger.debug("Entity XML " + payloadMap.get(messageKey));
}
}
} catch (JMSException e) {
logger.error(e);
closeConnection();
}
}
}
So it looks like either the listener or the broker stop responding and
messages get stuck in the queue. Are there any additional parameters I need
to configure? Any pointers appreciated.
Thanks for your help.