org.springframework.flex.messaging.MessageTemplate Maven / Gradle / Ivy
Go to download
Spring BlazeDS Integration is a top-level Spring project, and a component of the complete Spring Web stack. This
project's purpose is to make it easier to build Spring-powered Rich Internet Applications using Adobe Flex as the
front-end client. It aims to achieve this purpose by providing first-class support for using the open source
Adobe BlazeDS project and its powerful remoting and messaging facilities in combination with the familiar Spring
programming model.
/*
* Copyright 2002-2009 the original author or authors.
*
* 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 org.springframework.flex.messaging;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.flex.config.BeanIds;
import org.springframework.flex.messaging.jms.JmsAdapter;
import org.springframework.util.Assert;
import flex.messaging.FlexContext;
import flex.messaging.MessageBroker;
import flex.messaging.MessageDestination;
import flex.messaging.messages.AsyncMessage;
import flex.messaging.services.messaging.adapters.ActionScriptAdapter;
import flex.messaging.services.messaging.adapters.MessagingAdapter;
import flex.messaging.util.UUIDUtils;
/**
* Simple helper for sending Flex {@link AsyncMessage}s from a Java client. The message will be routed through the
* {@link MessageBroker} to the specified {@link MessageDestination}. This allows for flexible routing of the message
* using whatever {@link MessagingAdapter} is configured for the target destination, be it the basic BlazeDS
* {@link ActionScriptAdapter}, one of the provided Spring adapters such as {@link JmsAdapter} or {TODO
* SpringIntegrationAdapter}, or some other custom adapter implementation.
*
* @author Jeremy Grelle
*/
public class MessageTemplate implements InitializingBean, BeanFactoryAware {
private static final Log log = LogFactory.getLog(MessageTemplate.class);
private String defaultDestination;
private MessageBroker messageBroker;
private BeanFactory beanFactory;
private final String clientId = UUIDUtils.createUUID();
private final AsyncMessageCreator defaultMessageCreator = new DefaultAsyncMessageCreator();
/**
*
* {@inheritDoc}
*/
public void afterPropertiesSet() throws Exception {
if (this.messageBroker == null) {
// first try the default id
if (this.beanFactory.containsBean(BeanIds.MESSAGE_BROKER)) {
this.messageBroker = (MessageBroker) this.beanFactory.getBean(BeanIds.MESSAGE_BROKER, MessageBroker.class);
} else if (this.beanFactory instanceof ListableBeanFactory) {
ListableBeanFactory lbf = (ListableBeanFactory) this.beanFactory;
String[] brokerNames = lbf.getBeanNamesForType(MessageBroker.class);
if (brokerNames.length == 1) {
this.messageBroker = (MessageBroker) lbf.getBean(brokerNames[0]);
} else if (brokerNames.length > 1) {
log.warn("A MessageBroker was not explicitly set and one could not be auto-detected in the MessageTemplate's bean factory as "
+ "multiple MessageBrokers were found. Will fall back to attempting to obtain the MessageBroker from the FlexContext for "
+ "each operation.");
} else {
log.warn("A MessageBroker was not explicitly set and one could not be found in the MessageTemplate's bean factory. Will "
+ "will fall back to attempting to obtain the MessageBroker from the FlexContext for each operation.");
}
}
}
}
/**
* Creates a default {@link AsyncMessage}
*
* @return the created message
*/
public AsyncMessage createMessage() {
return this.defaultMessageCreator.createMessage();
}
/**
* Creates a default {@link AsyncMessage} for a specified destination
*
* @param destination the target destination for the message
* @return the created message
*/
public AsyncMessage createMessageForDestination(String destination) {
AsyncMessage message = this.defaultMessageCreator.createMessage();
message.setDestination(destination);
return message;
}
/**
* Returns the id of the default message destination for this template
*
* @return the default destination id
*/
public String getDefaultDestination() {
return this.defaultDestination;
}
/**
* Returns the {@link MessageBroker} for routing messages
*
* @return the message broker
*/
public MessageBroker getMessageBroker() {
if (this.messageBroker != null) {
return this.messageBroker;
}
Assert.notNull(FlexContext.getMessageBroker(), "A MessageBroker was not set on the MessageTemplate "
+ "and no thread-local MessageBroker could be found in the FlexContext.");
return FlexContext.getMessageBroker();
}
/**
* Sends a message created by the specified {@link AsyncMessageCreator}
*
* @param creator the message creator
*/
public void send(AsyncMessageCreator creator) {
getMessageBroker().routeMessageToService(creator.createMessage(), null);
}
/**
* Sends a message with the specified body to the default destination.
*
* @param body the body of the message
*/
public void send(Object body) {
Assert.hasText(this.defaultDestination, "Cannot send message - no default destination has been set for this MessageTemplate.");
send(this.defaultDestination, body);
}
/**
* Sends a message with the specified body to the specified destination
*
* @param destination the target destination id
* @param body the body of the message
*/
public void send(String destination, Object body) {
AsyncMessage message = this.defaultMessageCreator.createMessage();
message.setDestination(destination);
message.setBody(body);
getMessageBroker().routeMessageToService(message, null);
}
/**
*
* {@inheritDoc}
*/
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
/**
* Sets the id of the default message destination for this template
*
* @param defaultDestination the default destination id
*/
public void setDefaultDestination(String defaultDestination) {
this.defaultDestination = defaultDestination;
}
/**
* Sets the {@link MessageBroker} for routing messages
*
* @param messageBroker the message broker
*/
public void setMessageBroker(MessageBroker messageBroker) {
this.messageBroker = messageBroker;
}
private final class DefaultAsyncMessageCreator implements AsyncMessageCreator {
public AsyncMessage createMessage() {
AsyncMessage message = new AsyncMessage();
message.setClientId(MessageTemplate.this.clientId);
message.setMessageId(UUIDUtils.createUUID());
message.setTimestamp(System.currentTimeMillis());
return message;
}
}
}