package won.protocol.jms;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import org.apache.camel.*;
import org.apache.camel.impl.DefaultExchange;
import org.apache.camel.spi.Synchronization;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.util.Iterator;
import java.util.Map;
/**
* User: LEIH-NB
* Date: 04.11.13
*/
public class MessagingServiceImpl<T> implements ApplicationContextAware,MessagingService,CamelContextAware {
private static final long DEFAULT_JMS_EXPIRATION_TIME = 0;
private CamelContext camelContext;
private ProducerTemplate producerTemplate;
private final Logger logger = LoggerFactory.getLogger(getClass());
private ApplicationContext applicationContext;
/**
* This method shall be used for Request-Reply messaging.
*
* @param properties
* @param headers
* @param body
* @param endpoint
* @return
*/
public synchronized ListenableFuture sendInOutMessageGeneric(Map properties, Map headers, Object body, String endpoint){
Exchange exchange = new DefaultExchange(getCamelContext());
//TODO: the method name shall be set in the header of the message.
Endpoint ep = getCamelContext().getEndpoint(endpoint);
if (properties!=null){
if(properties.containsKey("methodName"))
exchange.setProperty("methodName", properties.get("methodName"));
}
if (headers!=null)
exchange.getIn().setHeaders(headers);
//exchange.getIn().getHeaders().put("CamelJmsRequestTimeout",DEFAULT_JMS_EXPIRATION_TIME);
//exchange.setProperty("JMSExpiration",DEFAULT_JMS_EXPIRATION_TIME);
exchange.getIn().setBody(body);
//exchange.getOut().setBody(body);
exchange.setPattern(ExchangePattern.InOut);
final SettableFuture<T> result = SettableFuture.create();
logger.debug("sending inout message");
producerTemplate.asyncCallback(ep,exchange, new Synchronization() {
@Override
public void onComplete(Exchange exchange) {
T resultObject = (T)exchange.getOut().getBody();
result.set(resultObject);
}
@Override
public void onFailure(Exchange exchange) {
if (exchange.getException() != null){
logger.warn("caught exception while sending jms message", exchange.getException());
}
result.cancel(true);
}
});
return result;
}
@Override
public void inspectMessage(Exchange exchange) {
if (!logger.isDebugEnabled()) {
return;
}
inspectProperties(exchange);
inspectHeaders(exchange);
if(exchange.getIn().getBody()!=null) {
logger.debug(exchange.getIn().getBody().toString());
}
}
public void inspectProperties(Exchange exchange){
Map properties = (Map) exchange.getProperties();
Iterator iter = properties.entrySet().iterator();
if (logger.isDebugEnabled()){
logger.debug("WIRETAP: properties size: "+properties.size());
while(iter.hasNext()){
Map.Entry pairs = (Map.Entry)iter.next();
logger.debug("key: "+pairs.getKey()+" value: "+pairs.getValue());
}
}
}
public void inspectBody(Exchange exchange){
exchange.getIn().getBody();
}
public void inspectHeaders(Exchange exchange){
Map headers = (Map) exchange.getIn().getHeaders();
Iterator iter = headers.entrySet().iterator();
if (logger.isDebugEnabled()) {
logger.debug("WIRETAP: headers size: "+headers.size());
while(iter.hasNext()){
Map.Entry pairs = (Map.Entry)iter.next();
if(pairs.getValue()!=null)
logger.debug("key: "+pairs.getKey()+" value: "+pairs.getValue());
}
}
}
public synchronized void sendInOnlyMessage(Map properties, Map headers, Object body, String endpoint){
Exchange exchange = new DefaultExchange(getCamelContext());
Endpoint ep = getCamelContext().getEndpoint(endpoint);
if (properties!=null){
if(properties.containsKey("methodName"))
exchange.setProperty("methodName", properties.get("methodName"));
if (properties.containsKey("protocol"))
exchange.setProperty("protocol",properties.get("protocol"));
}
if (headers!=null)
exchange.getIn().setHeaders(headers);
exchange.getIn().setBody(body);
producerTemplate.send(ep, exchange);
if (exchange.getException() != null){
logger.warn("caught exception while sending jms message", exchange.getException());
}
}
@Override
public void setCamelContext(CamelContext camelContext) {
this.camelContext = camelContext;
}
@Override
public CamelContext getCamelContext() {
return this.camelContext;
}
public void setProducerTemplate(ProducerTemplate producerTemplate) {
this.producerTemplate = producerTemplate;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}