/*
* Created on May 15, 2007
*/
package cyrille.jms.sample;
import java.io.ByteArrayOutputStream;
import java.io.StringReader;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.util.JAXBResult;
import javax.xml.bind.util.JAXBSource;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.JmsTemplate102;
import org.springframework.jms.core.MessageCreator;
import org.springframework.jms.core.MessagePostProcessor;
import org.springframework.jms.support.converter.MessageConversionException;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.util.Assert;
public class JmsQueueSender {
static class JaxbMessageConverter implements MessageConverter {
protected JAXBContext jaxbContext;
protected TransformerFactory transformerFactory;
public JaxbMessageConverter(JAXBContext jaxbContext) {
this.jaxbContext = jaxbContext;
this.transformerFactory = TransformerFactory.newInstance();
}
public Object fromMessage(Message message) throws JMSException, MessageConversionException {
try {
Assert.isInstanceOf(TextMessage.class, message);
TextMessage textMessage = (TextMessage) message;
JAXBResult result = new JAXBResult(this.jaxbContext);
Transformer transformer = this.transformerFactory.newTransformer();
transformer.transform(new StreamSource(new StringReader(textMessage.getText())), result);
return result.getResult();
} catch (Exception e) {
throw new RuntimeException("Exception unmarshalling message " + message, e);
}
}
public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
try {
Source source = new JAXBSource(this.jaxbContext, object);
Transformer transformer = this.transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
ByteArrayOutputStream out = new ByteArrayOutputStream();
transformer.transform(source, new StreamResult(out));
String text = out.toString("UTF-8");
TextMessage textMessage = session.createTextMessage(text);
// TODO enforce encoding on the message
return textMessage;
} catch (Exception e) {
throw new RuntimeException("Exception marshalling object " + object, e);
}
}
}
private JmsTemplate jmsTemplate;
private Queue queue;
public void setConnectionFactory(ConnectionFactory cf) {
this.jmsTemplate = new JmsTemplate102(cf, false);
}
public void setQueue(Queue queue) {
this.queue = queue;
}
public void simpleSend() {
this.jmsTemplate.send(this.queue, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("hello queue world");
}
});
}
public void sendWithConversion() {
Object xmlSource = null;
this.jmsTemplate.convertAndSend("testQueue", xmlSource, new MessagePostProcessor() {
public Message postProcessMessage(Message message) throws JMSException {
message.setIntProperty("AccountID", 1234);
message.setJMSCorrelationID("123-00001");
return message;
}
});
}
}