Thanks. I'll have to look into how to get the JConsole screenshot as I've never done it before. Do you think there might be something wrong with the my listener? I suspect the broker is working fine but the listener is the one that is dying. I'll try to debug with the JConsole. Thanks!
On Tue, Dec 25, 2012 at 2:49 PM, Raul Kripalani <r...@evosent.com> wrote: > Can you attach a JConsole screenshot of the Broker MBean attributes? > > Does this happen with just one destination or with all? > > The Inactivity Monitor WriteChecker is doing exactly what you pursue: > keeping the connection alive by sending pings back and forth. > > It doesn't report errors, so it looks like the connections are okay. The > Broker JMX screenshot may tell us what's going on. > > Raúl. > On 25 Dec 2012 19:33, "Jose Martinez" <jmarti...@opencrowd.com> wrote: > > > Seems like i keep having the issue even after increasing the limit. I > > wonder what does the 'WriteChecker" message really means. And why can't > the > > connection remain stable? Is there a way to automatically recycle the > > connection to keep it "fresh"? > > > > Any suggestions appreciated. > > > > > > On Mon, Dec 24, 2012 at 1:01 PM, Jose Martinez <jmarti...@opencrowd.com > > >wrote: > > > > > Thanks! > > > > > > I'll set it as follows: > > > broker.getSystemUsage().getTempUsage().setLimit(1024l*64l); > > > > > > And see how it goes. > > > > > > > > > > > > On Mon, Dec 24, 2012 at 12:03 PM, Raul Kripalani <r...@evosent.com> > > wrote: > > > > > >> You are setting a tempUsage limit of 2 kilobytes. Maybe you expected > > 2000 > > >> to mean megabytes, but the unit is bytes. See Javadoc [1]. > > >> > > >> In a non-persistent broker, the role of tempUsage is to buffer up > > >> non-persistent messages when consumers can't keep up. The temp storage > > >> implementation (PListStore) uses a default journal size of 32mb. So > your > > >> system locks up as soon as it lazy inits the PListStore for the first > > >> time, > > >> because tempUsage < default journal file size. > > >> > > >> My two cents. Please let us know if this helped. > > >> > > >> Thanks, > > >> > > >> [1] > > >> > > >> > > > http://activemq.apache.org/maven/5.7.0/activemq-core/apidocs/org/apache/activemq/usage/Usage.html#setLimit(long) > > >> . > > >> > > >> *Raúl Kripalani* > > >> Apache Camel Committer > > >> Enterprise Architect, Program Manager, Open Source Integration > > specialist > > >> http://about.me/raulkripalani | > > http://www.linkedin.com/in/raulkripalani > > >> http://blog.raulkr.net | twitter: @raulvk <http://twitter.com/raulvk> > > >> > > >> On Mon, Dec 24, 2012 at 4:50 PM, Jose Martinez < > jmarti...@opencrowd.com > > >> >wrote: > > >> > > >> > 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. > > >> > > > >> > > > > > > > > >