mirror of https://github.com/apache/activemq.git
Added support for length of time messages are processed by the broker -
fix for https://issues.apache.org/activemq/browse/AMQ-1160, https://issues.apache.org/activemq/browse/AMQ-1072, https://issues.apache.org/activemq/browse/AMQ-936 and ground work for for https://issues.apache.org/activemq/browse/AMQ-567 git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@561026 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b97f7d8479
commit
a401575569
|
@ -142,6 +142,7 @@ public class ActiveMQConnectionMetaData implements ConnectionMetaData {
|
||||||
jmxProperties.put("JMSXGroupID", "1");
|
jmxProperties.put("JMSXGroupID", "1");
|
||||||
jmxProperties.put("JMSXGroupSeq", "1");
|
jmxProperties.put("JMSXGroupSeq", "1");
|
||||||
jmxProperties.put("JMSXDeliveryCount","1");
|
jmxProperties.put("JMSXDeliveryCount","1");
|
||||||
|
jmxProperties.put("JMSXProducerTXID","1");
|
||||||
return jmxProperties.keys();
|
return jmxProperties.keys();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -896,8 +896,11 @@ public class ActiveMQMessageConsumer implements MessageAvailableConsumer, StatsC
|
||||||
ActiveMQMessage message=createActiveMQMessage(md);
|
ActiveMQMessage message=createActiveMQMessage(md);
|
||||||
beforeMessageIsConsumed(md);
|
beforeMessageIsConsumed(md);
|
||||||
try{
|
try{
|
||||||
|
boolean expired=message.isExpired();
|
||||||
|
if(!expired){
|
||||||
listener.onMessage(message);
|
listener.onMessage(message);
|
||||||
afterMessageIsConsumed(md,false);
|
}
|
||||||
|
afterMessageIsConsumed(md,expired);
|
||||||
}catch(RuntimeException e){
|
}catch(RuntimeException e){
|
||||||
if(session.isDupsOkAcknowledge()||session.isAutoAcknowledge()){
|
if(session.isDupsOkAcknowledge()||session.isAutoAcknowledge()){
|
||||||
// Redeliver the message
|
// Redeliver the message
|
||||||
|
|
|
@ -186,12 +186,17 @@ public interface Broker extends Region, Service {
|
||||||
*/
|
*/
|
||||||
BrokerInfo[] getPeerBrokerInfos();
|
BrokerInfo[] getPeerBrokerInfos();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify the Broker that a dispatch is going to happen
|
||||||
|
* @param messageDispatch
|
||||||
|
*/
|
||||||
|
public void preProcessDispatch(MessageDispatch messageDispatch);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify the Broker that a dispatch has happened
|
* Notify the Broker that a dispatch has happened
|
||||||
* @param messageDispatch
|
* @param messageDispatch
|
||||||
*/
|
*/
|
||||||
public void processDispatch(MessageDispatch messageDispatch);
|
public void postProcessDispatch(MessageDispatch messageDispatch);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true if the broker has stopped
|
* @return true if the broker has stopped
|
||||||
|
@ -263,11 +268,18 @@ public interface Broker extends Region, Service {
|
||||||
*/
|
*/
|
||||||
Broker getRoot();
|
Broker getRoot();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if a message has expired -allows default behaviour to be overriden -
|
||||||
|
* as the timestamp set by the producer can be out of sync with the broker
|
||||||
|
* @param messageReference
|
||||||
|
* @return true if the message is expired
|
||||||
|
*/
|
||||||
|
public boolean isExpired(MessageReference messageReference);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Message has Expired
|
* A Message has Expired
|
||||||
* @param context
|
* @param context
|
||||||
* @param messageReference
|
* @param messageReference
|
||||||
* @throws Exception
|
|
||||||
*/
|
*/
|
||||||
public void messageExpired(ConnectionContext context, MessageReference messageReference);
|
public void messageExpired(ConnectionContext context, MessageReference messageReference);
|
||||||
|
|
||||||
|
@ -275,7 +287,8 @@ public interface Broker extends Region, Service {
|
||||||
* A message needs to go the a DLQ
|
* A message needs to go the a DLQ
|
||||||
* @param context
|
* @param context
|
||||||
* @param messageReference
|
* @param messageReference
|
||||||
* @throws Exception
|
|
||||||
*/
|
*/
|
||||||
public void sendToDeadLetterQueue(ConnectionContext context,MessageReference messageReference);
|
public void sendToDeadLetterQueue(ConnectionContext context,MessageReference messageReference);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,149 +51,152 @@ public class BrokerFilter implements Broker {
|
||||||
|
|
||||||
final protected Broker next;
|
final protected Broker next;
|
||||||
|
|
||||||
public BrokerFilter(Broker next) {
|
public BrokerFilter(Broker next){
|
||||||
this.next=next;
|
this.next=next;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Broker getAdaptor(Class type){
|
public Broker getAdaptor(Class type){
|
||||||
if (type.isInstance(this)){
|
if(type.isInstance(this)){
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
return next.getAdaptor(type);
|
return next.getAdaptor(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map getDestinationMap() {
|
public Map getDestinationMap(){
|
||||||
return next.getDestinationMap();
|
return next.getDestinationMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set getDestinations(ActiveMQDestination destination) {
|
public Set getDestinations(ActiveMQDestination destination){
|
||||||
return next.getDestinations(destination);
|
return next.getDestinations(destination);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void acknowledge(ConsumerBrokerExchange consumerExchange, MessageAck ack) throws Exception {
|
public void acknowledge(ConsumerBrokerExchange consumerExchange,MessageAck ack) throws Exception{
|
||||||
next.acknowledge(consumerExchange, ack);
|
next.acknowledge(consumerExchange,ack);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Response messagePull(ConnectionContext context, MessagePull pull) throws Exception {
|
public Response messagePull(ConnectionContext context,MessagePull pull) throws Exception{
|
||||||
return next.messagePull(context, pull);
|
return next.messagePull(context,pull);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addConnection(ConnectionContext context, ConnectionInfo info) throws Exception {
|
public void addConnection(ConnectionContext context,ConnectionInfo info) throws Exception{
|
||||||
next.addConnection(context, info);
|
next.addConnection(context,info);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Subscription addConsumer(ConnectionContext context, ConsumerInfo info) throws Exception {
|
public Subscription addConsumer(ConnectionContext context,ConsumerInfo info) throws Exception{
|
||||||
return next.addConsumer(context, info);
|
return next.addConsumer(context,info);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addProducer(ConnectionContext context, ProducerInfo info) throws Exception {
|
public void addProducer(ConnectionContext context,ProducerInfo info) throws Exception{
|
||||||
next.addProducer(context, info);
|
next.addProducer(context,info);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void commitTransaction(ConnectionContext context, TransactionId xid, boolean onePhase) throws Exception {
|
public void commitTransaction(ConnectionContext context,TransactionId xid,boolean onePhase) throws Exception{
|
||||||
next.commitTransaction(context, xid, onePhase);
|
next.commitTransaction(context,xid,onePhase);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeSubscription(ConnectionContext context, RemoveSubscriptionInfo info) throws Exception {
|
public void removeSubscription(ConnectionContext context,RemoveSubscriptionInfo info) throws Exception{
|
||||||
next.removeSubscription(context, info);
|
next.removeSubscription(context,info);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TransactionId[] getPreparedTransactions(ConnectionContext context) throws Exception {
|
public TransactionId[] getPreparedTransactions(ConnectionContext context) throws Exception{
|
||||||
return next.getPreparedTransactions(context);
|
return next.getPreparedTransactions(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int prepareTransaction(ConnectionContext context, TransactionId xid) throws Exception {
|
public int prepareTransaction(ConnectionContext context,TransactionId xid) throws Exception{
|
||||||
return next.prepareTransaction(context, xid);
|
return next.prepareTransaction(context,xid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeConnection(ConnectionContext context, ConnectionInfo info, Throwable error) throws Exception {
|
public void removeConnection(ConnectionContext context,ConnectionInfo info,Throwable error) throws Exception{
|
||||||
next.removeConnection(context, info, error);
|
next.removeConnection(context,info,error);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeConsumer(ConnectionContext context, ConsumerInfo info) throws Exception {
|
public void removeConsumer(ConnectionContext context,ConsumerInfo info) throws Exception{
|
||||||
next.removeConsumer(context, info);
|
next.removeConsumer(context,info);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeProducer(ConnectionContext context, ProducerInfo info) throws Exception {
|
public void removeProducer(ConnectionContext context,ProducerInfo info) throws Exception{
|
||||||
next.removeProducer(context, info);
|
next.removeProducer(context,info);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void rollbackTransaction(ConnectionContext context, TransactionId xid) throws Exception {
|
public void rollbackTransaction(ConnectionContext context,TransactionId xid) throws Exception{
|
||||||
next.rollbackTransaction(context, xid);
|
next.rollbackTransaction(context,xid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void send(ProducerBrokerExchange producerExchange, Message messageSend) throws Exception {
|
public void send(ProducerBrokerExchange producerExchange,Message messageSend) throws Exception{
|
||||||
next.send(producerExchange, messageSend);
|
next.send(producerExchange,messageSend);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void beginTransaction(ConnectionContext context, TransactionId xid) throws Exception {
|
public void beginTransaction(ConnectionContext context,TransactionId xid) throws Exception{
|
||||||
next.beginTransaction(context, xid);
|
next.beginTransaction(context,xid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void forgetTransaction(ConnectionContext context, TransactionId transactionId) throws Exception {
|
public void forgetTransaction(ConnectionContext context,TransactionId transactionId) throws Exception{
|
||||||
next.forgetTransaction(context, transactionId);
|
next.forgetTransaction(context,transactionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Connection[] getClients() throws Exception {
|
public Connection[] getClients() throws Exception{
|
||||||
return next.getClients();
|
return next.getClients();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Destination addDestination(ConnectionContext context, ActiveMQDestination destination) throws Exception {
|
public Destination addDestination(ConnectionContext context,ActiveMQDestination destination) throws Exception{
|
||||||
return next.addDestination(context, destination);
|
return next.addDestination(context,destination);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeDestination(ConnectionContext context, ActiveMQDestination destination, long timeout) throws Exception {
|
public void removeDestination(ConnectionContext context,ActiveMQDestination destination,long timeout)
|
||||||
next.removeDestination(context, destination, timeout);
|
throws Exception{
|
||||||
|
next.removeDestination(context,destination,timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ActiveMQDestination[] getDestinations() throws Exception {
|
public ActiveMQDestination[] getDestinations() throws Exception{
|
||||||
return next.getDestinations();
|
return next.getDestinations();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start() throws Exception {
|
public void start() throws Exception{
|
||||||
next.start();
|
next.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() throws Exception {
|
public void stop() throws Exception{
|
||||||
next.stop();
|
next.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSession(ConnectionContext context, SessionInfo info) throws Exception {
|
public void addSession(ConnectionContext context,SessionInfo info) throws Exception{
|
||||||
next.addSession(context, info);
|
next.addSession(context,info);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeSession(ConnectionContext context, SessionInfo info) throws Exception {
|
public void removeSession(ConnectionContext context,SessionInfo info) throws Exception{
|
||||||
next.removeSession(context, info);
|
next.removeSession(context,info);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BrokerId getBrokerId() {
|
public BrokerId getBrokerId(){
|
||||||
return next.getBrokerId();
|
return next.getBrokerId();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getBrokerName() {
|
public String getBrokerName(){
|
||||||
return next.getBrokerName();
|
return next.getBrokerName();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void gc() {
|
public void gc(){
|
||||||
next.gc();
|
next.gc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void addBroker(Connection connection,BrokerInfo info){
|
public void addBroker(Connection connection,BrokerInfo info){
|
||||||
next.addBroker(connection, info);
|
next.addBroker(connection,info);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeBroker(Connection connection,BrokerInfo info){
|
public void removeBroker(Connection connection,BrokerInfo info){
|
||||||
next.removeBroker(connection, info);
|
next.removeBroker(connection,info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public BrokerInfo[] getPeerBrokerInfos(){
|
public BrokerInfo[] getPeerBrokerInfos(){
|
||||||
return next.getPeerBrokerInfos();
|
return next.getPeerBrokerInfos();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processDispatch(MessageDispatch messageDispatch){
|
public void preProcessDispatch(MessageDispatch messageDispatch){
|
||||||
next.processDispatch(messageDispatch);
|
next.preProcessDispatch(messageDispatch);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void postProcessDispatch(MessageDispatch messageDispatch){
|
||||||
|
next.postProcessDispatch(messageDispatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processDispatchNotification(MessageDispatchNotification messageDispatchNotification) throws Exception{
|
public void processDispatchNotification(MessageDispatchNotification messageDispatchNotification) throws Exception{
|
||||||
|
@ -209,28 +212,26 @@ public class BrokerFilter implements Broker {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addDestinationInfo(ConnectionContext context,DestinationInfo info) throws Exception{
|
public void addDestinationInfo(ConnectionContext context,DestinationInfo info) throws Exception{
|
||||||
next.addDestinationInfo(context, info);
|
next.addDestinationInfo(context,info);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeDestinationInfo(ConnectionContext context,DestinationInfo info) throws Exception{
|
public void removeDestinationInfo(ConnectionContext context,DestinationInfo info) throws Exception{
|
||||||
next.removeDestinationInfo(context, info);
|
next.removeDestinationInfo(context,info);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFaultTolerantConfiguration(){
|
public boolean isFaultTolerantConfiguration(){
|
||||||
return next.isFaultTolerantConfiguration();
|
return next.isFaultTolerantConfiguration();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConnectionContext getAdminConnectionContext() {
|
public ConnectionContext getAdminConnectionContext(){
|
||||||
return next.getAdminConnectionContext();
|
return next.getAdminConnectionContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAdminConnectionContext(ConnectionContext adminConnectionContext) {
|
public void setAdminConnectionContext(ConnectionContext adminConnectionContext){
|
||||||
next.setAdminConnectionContext(adminConnectionContext);
|
next.setAdminConnectionContext(adminConnectionContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Store getTempDataStore() {
|
public Store getTempDataStore(){
|
||||||
return next.getTempDataStore();
|
return next.getTempDataStore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,6 +247,10 @@ public class BrokerFilter implements Broker {
|
||||||
return next.getBrokerService();
|
return next.getBrokerService();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isExpired(MessageReference messageReference){
|
||||||
|
return next.isExpired(messageReference);
|
||||||
|
}
|
||||||
|
|
||||||
public void messageExpired(ConnectionContext context,MessageReference message){
|
public void messageExpired(ConnectionContext context,MessageReference message){
|
||||||
next.messageExpired(context,message);
|
next.messageExpired(context,message);
|
||||||
}
|
}
|
||||||
|
@ -254,7 +259,7 @@ public class BrokerFilter implements Broker {
|
||||||
next.sendToDeadLetterQueue(context,messageReference);
|
next.sendToDeadLetterQueue(context,messageReference);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Broker getRoot() {
|
public Broker getRoot(){
|
||||||
return next.getRoot();
|
return next.getRoot();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -185,13 +185,10 @@ public class EmptyBroker implements Broker {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public void preProcessDispatch(MessageDispatch messageDispatch) {
|
||||||
* Notifiy the Broker that a dispatch has happened
|
}
|
||||||
*
|
|
||||||
* @param messageDispatch
|
|
||||||
*/
|
|
||||||
public void processDispatch(MessageDispatch messageDispatch) {
|
|
||||||
|
|
||||||
|
public void postProcessDispatch(MessageDispatch messageDispatch) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processDispatchNotification(MessageDispatchNotification messageDispatchNotification) throws Exception {
|
public void processDispatchNotification(MessageDispatchNotification messageDispatchNotification) throws Exception {
|
||||||
|
@ -245,6 +242,10 @@ public class EmptyBroker implements Broker {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isExpired(MessageReference messageReference) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public void messageExpired(ConnectionContext context,MessageReference message){
|
public void messageExpired(ConnectionContext context,MessageReference message){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -188,7 +188,11 @@ public class ErrorBroker implements Broker {
|
||||||
throw new BrokerStoppedException(this.message);
|
throw new BrokerStoppedException(this.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processDispatch(MessageDispatch messageDispatch) {
|
public void preProcessDispatch(MessageDispatch messageDispatch) {
|
||||||
|
throw new BrokerStoppedException(this.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void postProcessDispatch(MessageDispatch messageDispatch) {
|
||||||
throw new BrokerStoppedException(this.message);
|
throw new BrokerStoppedException(this.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,6 +249,10 @@ public class ErrorBroker implements Broker {
|
||||||
throw new BrokerStoppedException(this.message);
|
throw new BrokerStoppedException(this.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isExpired(MessageReference messageReference) {
|
||||||
|
throw new BrokerStoppedException(this.message);
|
||||||
|
}
|
||||||
|
|
||||||
public void messageExpired(ConnectionContext context,MessageReference message){
|
public void messageExpired(ConnectionContext context,MessageReference message){
|
||||||
throw new BrokerStoppedException(this.message);
|
throw new BrokerStoppedException(this.message);
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,8 +200,12 @@ public class MutableBrokerFilter implements Broker {
|
||||||
return getNext().getPeerBrokerInfos();
|
return getNext().getPeerBrokerInfos();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processDispatch(MessageDispatch messageDispatch){
|
public void preProcessDispatch(MessageDispatch messageDispatch){
|
||||||
getNext().processDispatch(messageDispatch);
|
getNext().preProcessDispatch(messageDispatch);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void postProcessDispatch(MessageDispatch messageDispatch){
|
||||||
|
getNext().postProcessDispatch(messageDispatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processDispatchNotification(MessageDispatchNotification messageDispatchNotification) throws Exception{
|
public void processDispatchNotification(MessageDispatchNotification messageDispatchNotification) throws Exception{
|
||||||
|
@ -259,6 +263,9 @@ public class MutableBrokerFilter implements Broker {
|
||||||
return getNext().getBrokerService();
|
return getNext().getBrokerService();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isExpired(MessageReference messageReference) {
|
||||||
|
return getNext().isExpired(messageReference);
|
||||||
|
}
|
||||||
|
|
||||||
public void messageExpired(ConnectionContext context,MessageReference message){
|
public void messageExpired(ConnectionContext context,MessageReference message){
|
||||||
getNext().messageExpired(context,message);
|
getNext().messageExpired(context,message);
|
||||||
|
|
|
@ -741,7 +741,7 @@ public class TransportConnection implements Service,Connection,Task,CommandVisit
|
||||||
if(message.isMessageDispatch()) {
|
if(message.isMessageDispatch()) {
|
||||||
MessageDispatch md=(MessageDispatch) message;
|
MessageDispatch md=(MessageDispatch) message;
|
||||||
Runnable sub=md.getTransmitCallback();
|
Runnable sub=md.getTransmitCallback();
|
||||||
broker.processDispatch(md);
|
broker.postProcessDispatch(md);
|
||||||
if(sub!=null){
|
if(sub!=null){
|
||||||
sub.run();
|
sub.run();
|
||||||
}
|
}
|
||||||
|
@ -749,22 +749,23 @@ public class TransportConnection implements Service,Connection,Task,CommandVisit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void processDispatch(Command command) throws IOException {
|
protected void processDispatch(Command command) throws IOException{
|
||||||
try {
|
final MessageDispatch messageDispatch=(MessageDispatch)(command.isMessageDispatch()?command:null);
|
||||||
if( !disposed.get() ) {
|
try{
|
||||||
|
if(!disposed.get()){
|
||||||
|
if(messageDispatch!=null){
|
||||||
|
broker.preProcessDispatch(messageDispatch);
|
||||||
|
}
|
||||||
dispatch(command);
|
dispatch(command);
|
||||||
}
|
}
|
||||||
} finally {
|
}finally{
|
||||||
|
if(messageDispatch!=null){
|
||||||
if(command.isMessageDispatch()){
|
Runnable sub=messageDispatch.getTransmitCallback();
|
||||||
MessageDispatch md=(MessageDispatch) command;
|
broker.postProcessDispatch(messageDispatch);
|
||||||
Runnable sub=md.getTransmitCallback();
|
|
||||||
broker.processDispatch(md);
|
|
||||||
if(sub!=null){
|
if(sub!=null){
|
||||||
sub.run();
|
sub.run();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getStatistics().getDequeues().increment();
|
getStatistics().getDequeues().increment();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -918,7 +919,7 @@ public class TransportConnection implements Service,Connection,Task,CommandVisit
|
||||||
if(command.isMessageDispatch()) {
|
if(command.isMessageDispatch()) {
|
||||||
MessageDispatch md=(MessageDispatch) command;
|
MessageDispatch md=(MessageDispatch) command;
|
||||||
Runnable sub=md.getTransmitCallback();
|
Runnable sub=md.getTransmitCallback();
|
||||||
broker.processDispatch(md);
|
broker.postProcessDispatch(md);
|
||||||
if(sub!=null){
|
if(sub!=null){
|
||||||
sub.run();
|
sub.run();
|
||||||
}
|
}
|
||||||
|
|
|
@ -283,7 +283,7 @@ public class MasterBroker extends InsertableMutableBrokerFilter{
|
||||||
*
|
*
|
||||||
* @param messageDispatch
|
* @param messageDispatch
|
||||||
*/
|
*/
|
||||||
public void processDispatch(MessageDispatch messageDispatch){
|
public void postProcessDispatch(MessageDispatch messageDispatch){
|
||||||
MessageDispatchNotification mdn=new MessageDispatchNotification();
|
MessageDispatchNotification mdn=new MessageDispatchNotification();
|
||||||
mdn.setConsumerId(messageDispatch.getConsumerId());
|
mdn.setConsumerId(messageDispatch.getConsumerId());
|
||||||
mdn.setDeliverySequenceId(messageDispatch.getDeliverySequenceId());
|
mdn.setDeliverySequenceId(messageDispatch.getDeliverySequenceId());
|
||||||
|
@ -293,7 +293,7 @@ public class MasterBroker extends InsertableMutableBrokerFilter{
|
||||||
mdn.setMessageId(msg.getMessageId());
|
mdn.setMessageId(msg.getMessageId());
|
||||||
sendAsyncToSlave(mdn);
|
sendAsyncToSlave(mdn);
|
||||||
}
|
}
|
||||||
super.processDispatch(messageDispatch);
|
super.postProcessDispatch(messageDispatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -382,7 +382,7 @@ abstract public class PrefetchSubscription extends AbstractSubscription{
|
||||||
pending.remove();
|
pending.remove();
|
||||||
// Message may have been sitting in the pending list a while
|
// Message may have been sitting in the pending list a while
|
||||||
// waiting for the consumer to ak the message.
|
// waiting for the consumer to ak the message.
|
||||||
if(node!=QueueMessageReference.NULL_MESSAGE&&node.isExpired()){
|
if(node!=QueueMessageReference.NULL_MESSAGE&&broker.isExpired(node)){
|
||||||
broker.messageExpired(getContext(),node);
|
broker.messageExpired(getContext(),node);
|
||||||
dequeueCounter++;
|
dequeueCounter++;
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -137,7 +137,7 @@ public class Queue implements Destination, Task {
|
||||||
|
|
||||||
public boolean recoverMessage(Message message){
|
public boolean recoverMessage(Message message){
|
||||||
// Message could have expired while it was being loaded..
|
// Message could have expired while it was being loaded..
|
||||||
if(message.isExpired()){
|
if(broker.isExpired(message)){
|
||||||
broker.messageExpired(createConnectionContext(),message);
|
broker.messageExpired(createConnectionContext(),message);
|
||||||
destinationStatistics.getMessages().decrement();
|
destinationStatistics.getMessages().decrement();
|
||||||
return true;
|
return true;
|
||||||
|
@ -379,7 +379,7 @@ public class Queue implements Destination, Task {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
// While waiting for space to free up... the message may have expired.
|
// While waiting for space to free up... the message may have expired.
|
||||||
if(message.isExpired()) {
|
if(broker.isExpired(message)) {
|
||||||
broker.messageExpired(context,message);
|
broker.messageExpired(context,message);
|
||||||
destinationStatistics.getMessages().decrement();
|
destinationStatistics.getMessages().decrement();
|
||||||
} else {
|
} else {
|
||||||
|
@ -455,7 +455,7 @@ public class Queue implements Destination, Task {
|
||||||
try {
|
try {
|
||||||
// It could take while before we receive the commit
|
// It could take while before we receive the commit
|
||||||
// op, by that time the message could have expired..
|
// op, by that time the message could have expired..
|
||||||
if(message.isExpired()){
|
if(broker.isExpired(message)){
|
||||||
broker.messageExpired(context,message);
|
broker.messageExpired(context,message);
|
||||||
destinationStatistics.getMessages().decrement();
|
destinationStatistics.getMessages().decrement();
|
||||||
return;
|
return;
|
||||||
|
@ -1014,7 +1014,7 @@ public class Queue implements Destination, Task {
|
||||||
while(messages.hasNext()&&count<toPageIn){
|
while(messages.hasNext()&&count<toPageIn){
|
||||||
MessageReference node=messages.next();
|
MessageReference node=messages.next();
|
||||||
messages.remove();
|
messages.remove();
|
||||||
if(!node.isExpired()){
|
if(!broker.isExpired(node)){
|
||||||
node=createMessageReference(node.getMessage());
|
node=createMessageReference(node.getMessage());
|
||||||
result.add(node);
|
result.add(node);
|
||||||
count++;
|
count++;
|
||||||
|
|
|
@ -385,6 +385,7 @@ public class RegionBroker implements Broker {
|
||||||
public void send(ProducerBrokerExchange producerExchange,Message message) throws Exception{
|
public void send(ProducerBrokerExchange producerExchange,Message message) throws Exception{
|
||||||
long si=sequenceGenerator.getNextSequenceId();
|
long si=sequenceGenerator.getNextSequenceId();
|
||||||
message.getMessageId().setBrokerSequenceId(si);
|
message.getMessageId().setBrokerSequenceId(si);
|
||||||
|
message.setBrokerInTime(System.currentTimeMillis());
|
||||||
if(producerExchange.isMutable()||producerExchange.getRegion()==null){
|
if(producerExchange.isMutable()||producerExchange.getRegion()==null){
|
||||||
ActiveMQDestination destination=message.getDestination();
|
ActiveMQDestination destination=message.getDestination();
|
||||||
// ensure the destination is registered with the RegionBroker
|
// ensure the destination is registered with the RegionBroker
|
||||||
|
@ -538,8 +539,14 @@ public class RegionBroker implements Broker {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processDispatch(MessageDispatch messageDispatch){
|
public void preProcessDispatch(MessageDispatch messageDispatch){
|
||||||
|
Message message = messageDispatch.getMessage();
|
||||||
|
if(message != null) {
|
||||||
|
message.setBrokerOutTime(System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void postProcessDispatch(MessageDispatch messageDispatch){
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processDispatchNotification(MessageDispatchNotification messageDispatchNotification) throws Exception {
|
public void processDispatchNotification(MessageDispatchNotification messageDispatchNotification) throws Exception {
|
||||||
|
@ -625,6 +632,10 @@ public class RegionBroker implements Broker {
|
||||||
return brokerService;
|
return brokerService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isExpired(MessageReference messageReference) {
|
||||||
|
return messageReference.isExpired();
|
||||||
|
}
|
||||||
|
|
||||||
public void messageExpired(ConnectionContext context,MessageReference node){
|
public void messageExpired(ConnectionContext context,MessageReference node){
|
||||||
if(log.isDebugEnabled()){
|
if(log.isDebugEnabled()){
|
||||||
log.debug("Message expired "+node);
|
log.debug("Message expired "+node);
|
||||||
|
|
|
@ -263,7 +263,7 @@ public class Topic implements Destination {
|
||||||
|
|
||||||
// There is delay between the client sending it and it arriving at the
|
// There is delay between the client sending it and it arriving at the
|
||||||
// destination.. it may have expired.
|
// destination.. it may have expired.
|
||||||
if( message.isExpired() ) {
|
if( broker.isExpired(message) ) {
|
||||||
broker.messageExpired(context,message);
|
broker.messageExpired(context,message);
|
||||||
destinationStatistics.getMessages().decrement();
|
destinationStatistics.getMessages().decrement();
|
||||||
if( ( !message.isResponseRequired() || producerExchange.getProducerState().getInfo().getWindowSize() > 0 ) && !context.isInRecoveryMode() ) {
|
if( ( !message.isResponseRequired() || producerExchange.getProducerState().getInfo().getWindowSize() > 0 ) && !context.isInRecoveryMode() ) {
|
||||||
|
@ -286,7 +286,7 @@ public class Topic implements Destination {
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
// While waiting for space to free up... the message may have expired.
|
// While waiting for space to free up... the message may have expired.
|
||||||
if(message.isExpired()){
|
if(broker.isExpired(message)){
|
||||||
broker.messageExpired(context,message);
|
broker.messageExpired(context,message);
|
||||||
destinationStatistics.getMessages().decrement();
|
destinationStatistics.getMessages().decrement();
|
||||||
|
|
||||||
|
@ -357,7 +357,7 @@ public class Topic implements Destination {
|
||||||
public void afterCommit() throws Exception {
|
public void afterCommit() throws Exception {
|
||||||
// It could take while before we receive the commit
|
// It could take while before we receive the commit
|
||||||
// operration.. by that time the message could have expired..
|
// operration.. by that time the message could have expired..
|
||||||
if( message.isExpired() ) {
|
if(broker.isExpired(message) ) {
|
||||||
broker.messageExpired(context,message);
|
broker.messageExpired(context,message);
|
||||||
message.decrementReferenceCount();
|
message.decrementReferenceCount();
|
||||||
destinationStatistics.getMessages().decrement();
|
destinationStatistics.getMessages().decrement();
|
||||||
|
|
|
@ -129,7 +129,7 @@ public class TopicSubscription extends AbstractSubscription{
|
||||||
matched.reset();
|
matched.reset();
|
||||||
while(matched.hasNext()){
|
while(matched.hasNext()){
|
||||||
MessageReference node=matched.next();
|
MessageReference node=matched.next();
|
||||||
if(node.isExpired()){
|
if(broker.isExpired(node)){
|
||||||
matched.remove();
|
matched.remove();
|
||||||
dispatchedCounter.incrementAndGet();
|
dispatchedCounter.incrementAndGet();
|
||||||
node.decrementReferenceCount();
|
node.decrementReferenceCount();
|
||||||
|
@ -361,7 +361,7 @@ public class TopicSubscription extends AbstractSubscription{
|
||||||
matched.remove();
|
matched.remove();
|
||||||
// Message may have been sitting in the matched list a while
|
// Message may have been sitting in the matched list a while
|
||||||
// waiting for the consumer to ak the message.
|
// waiting for the consumer to ak the message.
|
||||||
if(message.isExpired()){
|
if(broker.isExpired(message)){
|
||||||
message.decrementReferenceCount();
|
message.decrementReferenceCount();
|
||||||
broker.messageExpired(getContext(),message);
|
broker.messageExpired(getContext(),message);
|
||||||
dequeueCounter.incrementAndGet();
|
dequeueCounter.incrementAndGet();
|
||||||
|
|
|
@ -28,6 +28,7 @@ public abstract class AbstractDeadLetterStrategy implements DeadLetterStrategy
|
||||||
private boolean processNonPersistent=true;
|
private boolean processNonPersistent=true;
|
||||||
private boolean processExpired=true;
|
private boolean processExpired=true;
|
||||||
|
|
||||||
|
|
||||||
public boolean isSendToDeadLetterQueue(Message message){
|
public boolean isSendToDeadLetterQueue(Message message){
|
||||||
boolean result=false;
|
boolean result=false;
|
||||||
if(message!=null){
|
if(message!=null){
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
package org.apache.activemq.broker.util;
|
package org.apache.activemq.broker.util;
|
||||||
|
|
||||||
import org.apache.activemq.broker.BrokerPluginSupport;
|
import org.apache.activemq.broker.BrokerPluginSupport;
|
||||||
import org.apache.activemq.broker.ConnectionContext;
|
|
||||||
import org.apache.activemq.broker.ProducerBrokerExchange;
|
import org.apache.activemq.broker.ProducerBrokerExchange;
|
||||||
import org.apache.activemq.command.Message;
|
import org.apache.activemq.command.Message;
|
||||||
|
|
||||||
|
|
|
@ -189,9 +189,9 @@ public class UDPTraceBrokerPlugin extends BrokerPluginSupport {
|
||||||
return super.prepareTransaction(context, xid);
|
return super.prepareTransaction(context, xid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processDispatch(MessageDispatch messageDispatch) {
|
public void postProcessDispatch(MessageDispatch messageDispatch) {
|
||||||
trace(messageDispatch);
|
trace(messageDispatch);
|
||||||
super.processDispatch(messageDispatch);
|
super.postProcessDispatch(messageDispatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processDispatchNotification(MessageDispatchNotification messageDispatchNotification) throws Exception {
|
public void processDispatchNotification(MessageDispatchNotification messageDispatchNotification) throws Exception {
|
||||||
|
|
|
@ -54,6 +54,8 @@ abstract public class Message extends BaseCommand implements MarshallAware, Mess
|
||||||
protected long expiration;
|
protected long expiration;
|
||||||
protected long timestamp;
|
protected long timestamp;
|
||||||
protected long arrival;
|
protected long arrival;
|
||||||
|
protected long brokerInTime;
|
||||||
|
protected long brokerOutTime;
|
||||||
protected String correlationId;
|
protected String correlationId;
|
||||||
protected ActiveMQDestination replyTo;
|
protected ActiveMQDestination replyTo;
|
||||||
protected boolean persistent;
|
protected boolean persistent;
|
||||||
|
@ -84,6 +86,8 @@ abstract public class Message extends BaseCommand implements MarshallAware, Mess
|
||||||
protected boolean droppable = false;
|
protected boolean droppable = false;
|
||||||
private BrokerId [] cluster;
|
private BrokerId [] cluster;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
abstract public Message copy();
|
abstract public Message copy();
|
||||||
|
|
||||||
protected void copy(Message copy) {
|
protected void copy(Message copy) {
|
||||||
|
@ -123,6 +127,8 @@ abstract public class Message extends BaseCommand implements MarshallAware, Mess
|
||||||
copy.arrival = arrival;
|
copy.arrival = arrival;
|
||||||
copy.connection = connection;
|
copy.connection = connection;
|
||||||
copy.regionDestination = regionDestination;
|
copy.regionDestination = regionDestination;
|
||||||
|
copy.brokerInTime=brokerInTime;
|
||||||
|
copy.brokerOutTime=brokerOutTime;
|
||||||
//copying the broker path breaks networks - if a consumer re-uses a consumed
|
//copying the broker path breaks networks - if a consumer re-uses a consumed
|
||||||
//message and forwards it on
|
//message and forwards it on
|
||||||
//copy.brokerPath = brokerPath;
|
//copy.brokerPath = brokerPath;
|
||||||
|
@ -630,4 +636,26 @@ abstract public class Message extends BaseCommand implements MarshallAware, Mess
|
||||||
public boolean isMessage() {
|
public boolean isMessage() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @openwire:property version=3
|
||||||
|
*/
|
||||||
|
public long getBrokerInTime(){
|
||||||
|
return this.brokerInTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBrokerInTime(long brokerInTime){
|
||||||
|
this.brokerInTime=brokerInTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @openwire:property version=3
|
||||||
|
*/
|
||||||
|
public long getBrokerOutTime(){
|
||||||
|
return this.brokerOutTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBrokerOutTime(long brokerOutTime){
|
||||||
|
this.brokerOutTime=brokerOutTime;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue