使用JMS发送消息--ActiveMQ

JMS消息服务是一个java标准,定义了使用消息代理的通用API。这就类似于JDBC为数据库操作提供了通用接口一样。
Spring 通过基于模板的抽象JMS功能提供支持,这个模板就是jmsTemplate。使用这个模板可以很容易的进行消息生产方发送队列和主题消息。在消费消息的哪一方也可以很容易的接收到这些消息。
在Spring中搭建消息代理
这里我们将选择ActiveMQ作为我们的消息代理产品,进行消息队列学习。

1. 创建连接工厂
使用声明式bean进行配置

<bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" p:brokerURL="tcp://localhost:61616">bean>

使用ActiveMQ自己的命名空间进行配置链接工厂,首先必须确保Spring声明了amq的命名空间。

//amq命名空间略
id="connectionFactroy" brokerURL="tcp://localhost:61616"/>

2. 声明消息ActiveMQ的目的地

//使用bean方式声明队列和主题
//声明队列
"queue" class="org.apache.activemq.command.ActiveMQQueue" c:_="spitter.queue">
//声明主题
"topic" class="org.apache.activemq.command.ActiveMQTopic" c:_="spitter.topic">
//使用命名空间声明队列和主题
//声明队列
id="apittleQueue" physicalName="xxxxxxx" />
//声明主题
id="apittleTopic" physicalName="xxxxxxx" />

上面我们已经建立好了消息队列的连接工厂和消息的目的地。现在开始使用Spring的JMS模板进行发送和接收。

3. 为了使用jmsTemplate简化消息的发送我们需要在配置文件中添加一下代码,将我们的链接工厂配置到jms模板中

id="jmsTemplate" class="org.springframework.jms.core.jmsTemplate" c:_-ref="connectionFactory" >

5. 发送消息

public interface AlertService{
    void sendSpittleAlert(Spittle spittle);
}

public class AlertServiceImpl implements AlertService{
    private JmsOperations jmsOperations;
    @Autowird
    public AlertServiceImpl(JmsOperations jmsOperations ){
    this.jmsOperations = jmsOperations;
}
    public void sendSplittleAlert(final Splittle splittle){
        jmsOperations.send(//发送消息
            "spitter.alert.queue",//设置发送目的地
            new MessageCreator(){
                public Message createMessage(Session session){
                    return session.createObjectMessage(splittle);
                }
            }
        );
    }
}

以上就实现了消息向特定目的地的发送,当发送消息的目的地是默认位置时,我们可以通过配置来完成(在发送消息时可以对消息进行转换使用message converter消息转换器)。

6. 接收消息

//同步方式接收异步发送消息,项目中不可使用
public Spitter retrieveSpittleAlert(){
    return (Spitter) jmsPOperations.receiveAndConvert();
}

使用receive(),receiveAndConvert(),方法都是同步的。这就意味着必须耐心等待消息的带来,因此这些方法会一直被阻塞,指导有可用的消息。同步接收异步发送消息,是不是感觉很奇怪。

7. 创建消息驱动的POJO—–创建消息监听

创建消息监听
//基于POJO实现SpittleAlertHandler
public class SpittleAlertHandler{

    public void handleSpittleAlert(Spittle spittle){
        //.... implementation goes here ....
    }
}
配置消息监听
<bean id="xxxx" class="xxxxxxxxxxxxxxx"/>
//将上面的bean生命为消息监听器
<jms:listener-container>
    <jms:listener destination="spitter.alert.queue"
    ref="应用上面id" method="handleSpittleAlert"
 />
jms:listener-container>

消息监听容器是一个特殊的bean,它可以监控JMS目的地并等待消息到达。一旦有消息,他就取出消息,然后把消息传递任意一个对此消息感兴趣的消息监听器。

你可能感兴趣的:(spring-消息)