com.cisco.oss.foundation.message.AbstractRabbitMQConcurrentMessageHandler Maven / Gradle / Ivy
/*
* Copyright 2015 Cisco Systems, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.cisco.oss.foundation.message;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Basic abstract handler that exposes the foundation message handler but also implements silently the RabbitMQ message handler
* Created by Yair Ogen on 24/04/2014.
*/
public abstract class AbstractRabbitMQConcurrentMessageHandler extends AbstractRabbitMQMessageHandler implements ConcurrentMessageHandler{
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractRabbitMQConcurrentMessageHandler.class);
private MessageIdentifier messageIdentifier = null;
private MessageDispatcher messageDispatcher = new LockMessageDispatcher(this);
private Map onWorkIdentifierMap;
public AbstractRabbitMQConcurrentMessageHandler(String consumerName) {
super(consumerName);
onWorkIdentifierMap = new ConcurrentHashMap();
}
public AbstractRabbitMQConcurrentMessageHandler(String consumerName, MessageIdentifier messageIdentifier) {
super(consumerName);
this.messageIdentifier = messageIdentifier;
onWorkIdentifierMap = new ConcurrentHashMap();
}
@Override
public final void onMessage(Message message) {
messageDispatcher.handleMessage(message);
}
@Override
public void onRecieveMessage(Message message) {
LOGGER.trace("Received message '{}'", message);
}
/**
* A message is dispatchable in case there is no other message with the same identifier that is in 'process' now.
* If a message has 'null' identifier a true value will be return.
*/
public boolean isDispatchable(Message message) {
if(messageIdentifier != null) {
String identifier = messageIdentifier.getIdentifier(message);
LOGGER.trace("Message identifier is: {}", identifier);
if (StringUtils.isNotEmpty(identifier)){
return !onWorkIdentifierMap.containsKey(identifier);
}
}
return true;
}
public void onDispatchMessage(Message message) {
LOGGER.trace("Dispatch message '{}'", message);
if(messageIdentifier != null){
String identifier = messageIdentifier.getIdentifier(message);
if (StringUtils.isNotEmpty(identifier)){
onWorkIdentifierMap.put(identifier, 0);
}
}
}
public void onCompleteMessage(Message message) {
LOGGER.trace("Complete message '{}'", message);
if(messageIdentifier != null){
String identifier = messageIdentifier.getIdentifier(message);
if (StringUtils.isNotEmpty(identifier)){
onWorkIdentifierMap.remove(identifier);
}
}
}
public void onException(Message message, Throwable throwable) {
LOGGER.error("Problem handling message: {}. error is: {}", message, throwable.toString(), throwable);
if(messageIdentifier != null){
String identifier = messageIdentifier.getIdentifier(message);
if (StringUtils.isNotEmpty(identifier)){
onWorkIdentifierMap.remove(identifier);
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy