import org.apache.activemq.command.Message; //导入方法依赖的package包/类
@Override
public boolean sendToDeadLetterQueue(ConnectionContext context, MessageReference node, Subscription subscription, Throwable poisonCause) {
try {
if (node != null) {
Message message = node.getMessage();
if (message != null && node.getRegionDestination() != null) {
DeadLetterStrategy deadLetterStrategy = ((Destination) node.getRegionDestination()).getDeadLetterStrategy();
if (deadLetterStrategy != null) {
if (deadLetterStrategy.isSendToDeadLetterQueue(message)) {
// message may be inflight to other subscriptions so do not modify
message = message.copy();
stampAsExpired(message);
message.setExpiration(0);
if (!message.isPersistent()) {
message.setPersistent(true);
message.setProperty("originalDeliveryMode", "NON_PERSISTENT");
}
if (poisonCause != null) {
message.setProperty(ActiveMQMessage.DLQ_DELIVERY_FAILURE_CAUSE_PROPERTY,
poisonCause.toString());
}
// The original destination and transaction id do
// not get filled when the message is first sent,
// it is only populated if the message is routed to
// another destination like the DLQ
ActiveMQDestination deadLetterDestination = deadLetterStrategy.getDeadLetterQueueFor(message, subscription);
if (context.getBroker() == null) {
context.setBroker(getRoot());
}
BrokerSupport.resendNoCopy(context, message, deadLetterDestination);
return true;
}
} else {
LOG.debug("Dead Letter message with no DLQ strategy in place, message id: {}, destination: {}", message.getMessageId(), message.getDestination());
}
}
}
} catch (Exception e) {
LOG.warn("Caught an exception sending to DLQ: {}", node, e);
}
return false;
}