Spring + ActiveMQ实现jms发送消息
来源:互联网 发布:kakakaoo阿沁扒皮知乎 编辑:程序博客网 时间:2024/04/19 14:47
1. 概述:Spring提供了一个用于简化JMS API使用的抽象框架,并且对用户屏蔽了JMS API中1.0.2和1.1版本的差异。
JMS的功能大致上分为两块,叫做消息制造和消息消耗。JmsTemplate 用于制造消息和同步消息接收。我们今天就用JmsTemplate实现同步的消息接受。
使用JMS发(接)消息的步骤:
1)创建连接工厂
2)使用连接工厂创建连接
3)使用连接创建会话
4)获取一个目的地
5)使用会话和目的地创建消息生产者(消息消费者)
6)使用连接创建一个需要发送的消息类型实例
7)使用连接的一个队列发送器或主题公布器,使用发送器或者主题器发送消息(接受消息)
spring中的JmsTemplate实现了对jms的一些封装,内部提供了很多的方法,我们只需要实现定义的回调接口即可。JmsTemplate继承自JmsAccessor,在JmsAccessor中有ConnectionFactory的定义,而JmsTemplate本身的构造方法也有对ConnectionFactory的封装:
public JmsTemplate(ConnectionFactory connectionFactory) {
this();
setConnectionFactory(connectionFactory);
afterPropertiesSet();
}
所以,我们有两种方式注入ConnectionFactory,本文我们采用构造方法的方式。
spring_jms.xml
MessageCreator 回调接口通过JmsTemplate中调用代码提供的Session来创建一条消息。
看一下MessageCreator接口:
public interface MessageCreator {
Message createMessage(Session session) throws JMSException;
}
那么,我们来实现发送和接受消息DummyJms类
public class DummyJms {
public static void main(String[] args) throws Exception{
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
JmsTemplate jmsTemplate = (JmsTemplate)context.getBean("jmsTemplate");
Destination destination = (Destination)context.getBean("destination");
jmsTemplate.send(destination, new MessageCreator(){
public Message createMessage(Session session)
throws JMSException {
return session.createTextMessage("send message ");
}
});
TextMessage msg = (TextMessage)jmsTemplate.receive(destination);
System.out.println("receive message = " + msg.getText());
}
}
输出结果:
receive message = send message
可是我们并没有看到的像前文描述的那那些创建消息生产者,消息消费者的一些东西。继续分析,我们可以看一下,
jmsTemplate.send(Destination destination,MessageCreator messageCreator)这里到底做了什么,可以让我们不费吹灰之力,就可以实现消息的发送。JmsTemplate源代码:
public void send(final Destination destination, final MessageCreator messageCreator) throws JmsException {
execute(new SessionCallback() {
public Object doInJms(Session session) throws JMSException {
doSend(session, destination, messageCreator);
return null;
}
}, false);
}
JmsTemplate实现了JmsOperations接口,在JmsOperations里有
T execute(SessionCallback action) throws JmsException;
的定义。
那么这个SessionCallback接口是什么呢?它也为用户提供了JMS session。
public interface SessionCallback {
T doInJms(Session session) throws JMSException;
}
继续往下看。doSend方法:
protected void doSend(Session session, Destination destination, MessageCreator messageCreator)
throws JMSException {
Assert.notNull(messageCreator, "MessageCreator must not be null");
MessageProducer producer = createProducer(session, destination);
try {
Message message = messageCreator.createMessage(session);
if (logger.isDebugEnabled()) {
logger.debug("Sending created message: " + message);
}
doSend(producer, message);
// Check commit - avoid commit call within a JTA transaction.
if (session.getTransacted() && isSessionLocallyTransacted(session)) {
// Transacted session created by this template -> commit.
JmsUtils.commitIfNecessary(session);
}
}
finally {
JmsUtils.closeMessageProducer(producer);
}
}
createProducer()方法又调用了doCreateProducer(),实际的消息生产者在这里。
protected MessageProducer doCreateProducer(Session session, Destination destination) throws JMSException {
return session.createProducer(destination);
}
在这里,我们看到了,spring创建了消息的发送者,关闭连接的一些操作。到这里,大家就明白了,spring内部处理Jms消息的过程了吧(消息的接受也是一样)。
注:本文使用spring3.0和activemq5.2版本。
JMS的功能大致上分为两块,叫做消息制造和消息消耗。JmsTemplate 用于制造消息和同步消息接收。我们今天就用JmsTemplate实现同步的消息接受。
使用JMS发(接)消息的步骤:
1)创建连接工厂
2)使用连接工厂创建连接
3)使用连接创建会话
4)获取一个目的地
5)使用会话和目的地创建消息生产者(消息消费者)
6)使用连接创建一个需要发送的消息类型实例
7)使用连接的一个队列发送器或主题公布器,使用发送器或者主题器发送消息(接受消息)
spring中的JmsTemplate实现了对jms的一些封装,内部提供了很多的方法,我们只需要实现定义的回调接口即可。JmsTemplate继承自JmsAccessor,在JmsAccessor中有ConnectionFactory的定义,而JmsTemplate本身的构造方法也有对ConnectionFactory的封装:
public JmsTemplate(ConnectionFactory connectionFactory) {
this();
setConnectionFactory(connectionFactory);
afterPropertiesSet();
}
所以,我们有两种方式注入ConnectionFactory,本文我们采用构造方法的方式。
spring_jms.xml
MessageCreator 回调接口通过JmsTemplate中调用代码提供的Session来创建一条消息。
看一下MessageCreator接口:
public interface MessageCreator {
Message createMessage(Session session) throws JMSException;
}
那么,我们来实现发送和接受消息DummyJms类
public class DummyJms {
public static void main(String[] args) throws Exception{
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
JmsTemplate jmsTemplate = (JmsTemplate)context.getBean("jmsTemplate");
Destination destination = (Destination)context.getBean("destination");
jmsTemplate.send(destination, new MessageCreator(){
public Message createMessage(Session session)
throws JMSException {
return session.createTextMessage("send message ");
}
});
TextMessage msg = (TextMessage)jmsTemplate.receive(destination);
System.out.println("receive message = " + msg.getText());
}
}
输出结果:
receive message = send message
可是我们并没有看到的像前文描述的那那些创建消息生产者,消息消费者的一些东西。继续分析,我们可以看一下,
jmsTemplate.send(Destination destination,MessageCreator messageCreator)这里到底做了什么,可以让我们不费吹灰之力,就可以实现消息的发送。JmsTemplate源代码:
public void send(final Destination destination, final MessageCreator messageCreator) throws JmsException {
execute(new SessionCallback() {
public Object doInJms(Session session) throws JMSException {
doSend(session, destination, messageCreator);
return null;
}
}, false);
}
JmsTemplate实现了JmsOperations接口,在JmsOperations里有
T execute(SessionCallback action) throws JmsException;
的定义。
那么这个SessionCallback接口是什么呢?它也为用户提供了JMS session。
public interface SessionCallback {
T doInJms(Session session) throws JMSException;
}
继续往下看。doSend方法:
protected void doSend(Session session, Destination destination, MessageCreator messageCreator)
throws JMSException {
Assert.notNull(messageCreator, "MessageCreator must not be null");
MessageProducer producer = createProducer(session, destination);
try {
Message message = messageCreator.createMessage(session);
if (logger.isDebugEnabled()) {
logger.debug("Sending created message: " + message);
}
doSend(producer, message);
// Check commit - avoid commit call within a JTA transaction.
if (session.getTransacted() && isSessionLocallyTransacted(session)) {
// Transacted session created by this template -> commit.
JmsUtils.commitIfNecessary(session);
}
}
finally {
JmsUtils.closeMessageProducer(producer);
}
}
createProducer()方法又调用了doCreateProducer(),实际的消息生产者在这里。
protected MessageProducer doCreateProducer(Session session, Destination destination) throws JMSException {
return session.createProducer(destination);
}
在这里,我们看到了,spring创建了消息的发送者,关闭连接的一些操作。到这里,大家就明白了,spring内部处理Jms消息的过程了吧(消息的接受也是一样)。
注:本文使用spring3.0和activemq5.2版本。
- Spring + ActiveMQ实现jms发送消息
- Spring + ActiveMQ实现jms发送消息
- spring-jms(activemq实现)使用queue发送消息简单例子
- Spring + ActiveMQ兑现jms发送消息
- Spring + ActiveMQ兑现jms发送消息
- Spring+JMS+ActiveMQ+Tomcat实现消息服务
- Spring+JMS+ActiveMQ+Tomcat实现消息服务
- Blazeds+JMS(ActiveMQ)+Spring实现消息
- Spring+JMS+ActiveMQ+Tomcat实现消息服务
- Spring+JMS+ActiveMQ+Tomcat实现消息服务
- Spring+JMS+ActiveMQ+Tomcat实现消息服务
- JMS之Spring +activeMQ实现消息队列
- Spring+JMS+ActiveMQ+Tomcat实现消息服务
- Spring+JMS+ActiveMQ+Tomcat实现消息服务
- jms+spring+activemq配置(发送和接收消息)
- jms+spring+activemq配置(发送和接收消息)
- 使用JMS发送消息--ActiveMQ
- 深入浅出JMS(六)--ActiveMQ实现消息队列发送邮件
- 【Cocos2d-X游戏实战开发】捕鱼达人之开始场景的创建(三)
- UVA 10051 - Tower of Cubes(dp + DAG最长路径)
- XML学习经验实例总结2
- Java I/O 字节流 文件复制
- python操作Excel读写--使用xlrd
- Spring + ActiveMQ实现jms发送消息
- spring bean注册
- 创建oracle表空间、用户、授权
- fuse安装
- 如何在使用摩托罗拉上的RSS阅读器应用进行一次订阅
- sping jar包 讲解
- 新人培训总结
- JVM 垃圾回收机制与GC性能调优
- POJ 1833下K个全排列