checkClosed(); checkMessageListener(); if (timeout == 0) { return this.receive(); sendPullCommand(timeout); while (timeout > 0) { md = dequeue(-1); // We let the broker let us know when we timeout. } else { md = dequeue(timeout); beforeMessageIsConsumed(md); afterMessageIsConsumed(md, false); return createActiveMQMessage(md);
acknowledge(md, MessageAck.EXPIRED_ACK_TYPE); stats.getExpiredMessageCount().increment(); } else { if (session.getTransacted()) { } else if (isAutoAcknowledgeEach()) { if (deliveryingAcknowledgements.compareAndSet(false, true)) { synchronized (deliveredMessages) { MessageAck ack = makeAckForAllDeliveredMessages(MessageAck.STANDARD_ACK_TYPE); if (ack != null) { deliveredMessages.clear(); MessageAck ack = makeAckForAllDeliveredMessages(MessageAck.STANDARD_ACK_TYPE); if (ack!=null) { deliveredMessages.clear(); } else if (isAutoAcknowledgeBatch()) { ackLater(md, MessageAck.STANDARD_ACK_TYPE); } else if (session.isClientAcknowledge()||session.isIndividualAcknowledge()) { boolean messageUnackedByConsumer = false; ackLater(md, MessageAck.DELIVERED_ACK_TYPE);
protected void close(ConsumerId id) { for (Iterator<ActiveMQMessageConsumer> iter = consumers.iterator(); iter.hasNext();) { ActiveMQMessageConsumer c = iter.next(); if (c.getConsumerId().equals(id)) { try { c.close(); } catch (JMSException e) { LOG.warn("Exception closing consumer", e); } LOG.warn("Closed consumer on Command, " + id); break; } } }
@Override public void execute() throws Exception { checkClosed(); session.checkClosed(); acknowledge(md); } });
MessageListener listener = this.messageListener.get(); try { clearMessagesInProgress(); clearDeliveredList(); synchronized (unconsumedMessages.getMutex()) { if (!unconsumedMessages.isClosed()) { if (this.info.isBrowser() || !session.connection.isDuplicate(this, md.getMessage())) { if (listener != null && unconsumedMessages.isRunning()) { if (redeliveryExceeded(md)) { posionAck(md, "listener dispatch[" + md.getRedeliveryCounter() + "] to " + getConsumerId() + " exceeds redelivery policy limit:" + redeliveryPolicy); return; ActiveMQMessage message = createActiveMQMessage(md); beforeMessageIsConsumed(md); try { boolean expired = isConsumerExpiryCheckEnabled() && message.isExpired(); if (!expired) { listener.onMessage(message); afterMessageIsConsumed(md, expired); } catch (RuntimeException e) { LOG.error("{} Exception while processing message: {}", getConsumerId(), md.getMessage().getMessageId(), e); md.setRollbackCause(e); if (isAutoAcknowledgeBatch() || isAutoAcknowledgeEach() || session.isIndividualAcknowledge()) { rollback(); } else { afterMessageIsConsumed(md, false);
public void dispatch(MessageDispatch md) { MessageListener listener = this.messageListener.get(); try { clearMessagesInProgress(); clearDispatchList(); synchronized (unconsumedMessages.getMutex()) { if (!unconsumedMessages.isClosed()) { if (this.info.isBrowser() || !session.connection.isDuplicate(this, md.getMessage())) { if (listener != null && unconsumedMessages.isRunning()) { ActiveMQMessage message = createActiveMQMessage(md); beforeMessageIsConsumed(md); try { boolean expired = message.isExpired(); afterMessageIsConsumed(md, expired); } catch (RuntimeException e) { LOG.error(getConsumerId() + " Exception while processing message: " + md.getMessage().getMessageId(), e); if (isAutoAcknowledgeBatch() || isAutoAcknowledgeEach() || session.isIndividualAcknowledge()) { rollback(); } else { afterMessageIsConsumed(md, false); if (!session.isTransacted()) { if (LOG.isDebugEnabled()) { LOG.debug(getConsumerId() + " ignoring (auto acking) duplicate: " + md.getMessage()); } else { if (LOG.isDebugEnabled()) {
this.redeliveryPolicy = new RedeliveryPolicy(); setTransformer(session.getTransformer()); if (this.optimizeAcknowledge) { this.optimizeAcknowledgeTimeOut = session.connection.getOptimizeAcknowledgeTimeOut(); setOptimizedAckScheduledAckInterval(session.connection.getOptimizedAckScheduledAckInterval()); this.consumerExpiryCheckEnabled = session.connection.isConsumerExpiryCheckEnabled(); if (messageListener != null) { setMessageListener(messageListener); start();
public void rollback() throws JMSException { clearDeliveredList(); synchronized (unconsumedMessages.getMutex()) { if (optimizeAcknowledge) { rollbackPreviouslyDeliveredAndNotRedelivered(); if (deliveredMessages.isEmpty()) { return; start();
@Override public void beforeEnd() throws Exception { if (transactedIndividualAck) { clearDeliveredList(); waitForRedeliveries(); synchronized(deliveredMessages) { rollbackOnFailedRecoveryRedelivery(); } } else { acknowledge(); } synchronizationRegistered = false; }
@Override public void afterRollback() throws Exception { rollback(); synchronizationRegistered = false; } });
TextMessage msg = (TextMessage) amqConsumer.receive(); assertNotNull(msg); assertTrue("message has \"no expiry\" text: " + msg.getText(), msg.getText().contains("no expiry")); amqConsumer.acknowledge(); assertEquals("consumer has expiredMessages", count, amqConsumer.getConsumerStats().getExpiredMessageCount().getCount());
@Override public void run() { try { if (started.get()) { start(); } } catch (JMSException e) { session.connection.onAsyncException(e); } } }, redeliveryDelay);
deliverAcks(); if (isAutoAcknowledgeBatch()) { acknowledge();
destination = createDestination(session, destinationType); ActiveMQMessageConsumer consumer = (ActiveMQMessageConsumer) session.createConsumer(destination); consumer.setMessageListener(new MessageListener() { @Override public void onMessage(Message m) { consumer.stop(); consumer.start(); assertTrue(done2.await(1, TimeUnit.SECONDS)); assertEquals(2, counter.get());
this.scheduler = session.getScheduler(); this.redeliveryPolicy = session.connection.getRedeliveryPolicy(); setTransformer(session.getTransformer()); this.failoverRedeliveryWaitPeriod = session.connection.getConsumerFailoverRedeliveryWaitPeriod(); if (messageListener != null) { setMessageListener(messageListener); start();
public void start() throws Exception { if (started.compareAndSet(false, true)) { session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQTopic advisoryTopic = AdvisorySupport.getConsumerAdvisoryTopic(destination); consumer = (ActiveMQMessageConsumer) session.createConsumer(advisoryTopic); consumer.setMessageListener(this); } }
private void destroyConsumer() { if (consumer == null) { return; } try { if (session.getTransacted() && session.getTransactionContext().isInLocalTransaction()) { session.commit(); } consumer.close(); consumer = null; } catch (JMSException e) { e.printStackTrace(); } }
public JMSConsumerStatsImpl[] getConsumers() { // lets make a snapshot before we process them Object[] consumerArray = consumers.toArray(); int size = consumerArray.length; JMSConsumerStatsImpl[] answer = new JMSConsumerStatsImpl[size]; for (int i = 0; i < size; i++) { ActiveMQMessageConsumer consumer = (ActiveMQMessageConsumer)consumerArray[i]; answer[i] = consumer.getConsumerStats(); } return answer; }
/** * Stops this session. * * @throws JMSException */ protected void stop() throws JMSException { for (Iterator<ActiveMQMessageConsumer> iter = consumers.iterator(); iter.hasNext();) { ActiveMQMessageConsumer c = iter.next(); c.stop(); } started.set(false); executor.stop(); }
/** * @return the next message */ public Object nextElement() { while (true) { synchronized (this) { if (consumer == null) { return null; } } try { javax.jms.Message answer = consumer.receiveNoWait(); if (answer != null) { return answer; } } catch (JMSException e) { this.session.connection.onClientInternalException(e); return null; } if (browseDone.get() || !session.isRunning()) { destroyConsumer(); return null; } waitForMessage(); } }