activeMQ使用总结

来源:互联网 发布:java三元表达式 编辑:程序博客网 时间:2024/05/17 04:41

这几天在看异步消息,想到了jms,想到了activeMQ。下面是使用记录:

activeMQ可以直接官网上下到。

理解:activeMQ实现了一个队列,提供了tcp、socket等多种连接方式,通过java 的JMS进行发送消息和监听消息。

            消息分为两种:queue(队列)、topic(主题),队列是点对点的生产者、消费者模式,主题是发布、订阅模式。

开发与学习过程:

1、网上查找activeMQ和JMS相关资料,大致了解了上面理解的内容。

2、快速的进行开发,集成spring,因为集成spring把监听、队列等jms组件都定义好,更加方便学习。

spring集成jms组件包括:

 jmsTemplate:

<!-- 同步和异步消息jmsTemplate -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="receiveTimeout" value="10000" />
</bean>
<bean id="asyJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="asyConnectionFactory" />
<property name="receiveTimeout" value="10000" />
</bean>
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616" />
</bean>
<bean id="asyConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616?jms.useAsyncSend=true" />
</bean>

 队列:

<!-- 消息回复队列 -->
<bean id="responseQueue" class="org.apache.activemq.command.ActiveMQQueue"><constructor-arg value="response_queue"/></bean>

监听:

<!-- 回复消息监听器 -->
<bean id="responseQueueListener" class="utry.jms.listener.ResponseQueueListener"/>
<!-- 回复对应的监听容器 -->
<bean id="responseQueueMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="responseQueue"/>
<property name="messageListener" ref="responseQueueListener"/>
</bean>


发送:

public void sendMsg(String destinationName, Serializable obj,
boolean asyncSend) {
if (asyncSend) {
asyJmsTemplate.convertAndSend(destinationName, obj);
} else {
jmsTemplate.convertAndSend(destinationName, obj);
}
}

3、分析监听器类别并选取自己需要的监听器类别:

监听器是执行消息处理的最终要方法,JMS提供了MessageListener接口,实现MessageListener接口并实现OnMessage方法,即可实现消息的监听。

但是,这种方式并没有返回一个处理结束的结果,这是就考虑到了spring提供的SessionAwareMessageListener接口,实现SessionAwareMessageListener接口并实现OnMessage方法,即可实现监听,但是不同的是,OnMessag有两个参数TextMessage message, Session session:通过session可是实现回复该线程         MessageProducer producer = session.createProducer(destination);          Message textMessage = session.createTextMessage("ConsumerSessionAwareMessageListener。。。");  producer.send(textMessage);  

上面这种方式明显已经可以实现回复信息,但是相对于MessageListenerAdapter还是略显粗暴,MessageListenerAdapter直接实现了以上两个接口,可以直接通过它选择监听方法、操作方法,绑定回复队列。然后DefaultMessageListenerContainer设置messageListener为当前adapter就ok了。

<bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">   <property name="delegate" ref="consumerMessageListener"/>   <property name="defaultListenerMethod" value="receiveMessage"/>   <property name="defaultResponseDestination" ref="responseQueue"/></bean><!-- 消息监听适配器对应的监听容器 --><bean id="messageListenerAdapterContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">   <property name="connectionFactory" ref="connectionFactory"/>   <property name="destination" ref="queueDestination"/>   <property name="messageListener" ref="messageListenerAdapter"/><!-- 使用MessageListenerAdapter来作为消息监听器 --></bean>
4、动态添加监听创建队列:

在真正项目使用时,并不会简单意义上的在配置文件中固定几个队列和几个监听。所以要提供接口供开发者进行调用:

注册监听:

public void receiveMsg(String destinationName, IMessageListener listener){
Hashtable<String, Class<IMessageListener>> cache=JmsCache.getCache();
if(cache.containsKey(destinationName)){
System.out.println("监听已经存在");
}else{
cache.put(destinationName, (Class<IMessageListener>) listener.getClass());
System.out.println("注册监听");
//监听容器
    DefaultMessageListenerContainer jmsContainer = new DefaultMessageListenerContainer();
    //获取adapter
    JmsMessageListenerAdapter messageListener=new JmsMessageListenerAdapter(listener);
    MessageListenerAdapter messageListenerAdapter=messageListener.getMessageListenerAdapter();
    
    //设置监听容器
    jmsContainer.setMessageListener(messageListenerAdapter);
    jmsContainer.setConnectionFactory(connectionFactory);
    jmsContainer.setDestinationName(destinationName);
    jmsContainer.setSessionTransacted(false);
    jmsContainer.initialize();
    jmsContainer.start();
}
}

adapter实现类

 //MessageListenerAdapter
    private MessageListenerAdapter messageListenerAdapter=new MessageListenerAdapter();
    //监听器
    private IMessageListener delegate;
    //实现方法
    private final String methodName="executeMessage";
    //监听回复地址:responseQueue
    private final String defaultdestination="response_queue";


    /**
     * 默认无参构造
     */
    public JmsMessageListenerAdapter(){}


    /**
     * 构造方法
     * @param delegate
     * 备注:responseQueue是为默认监听
     */
    public JmsMessageListenerAdapter(IMessageListener delegate){
        this.delegate=delegate;
    }


    /**
     * 获取MessageListenerAdapter
     * @return
     */
    public MessageListenerAdapter getMessageListenerAdapter(){
        messageListenerAdapter.setDelegate(delegate);
        messageListenerAdapter.setDefaultListenerMethod(methodName);
        messageListenerAdapter.setDefaultResponseQueueName(defaultdestination);
        return messageListenerAdapter;
    }


发送消息:

public void sendMsg(String destinationName, Serializable obj,
boolean asyncSend) {
if (asyncSend) {
asyJmsTemplate.convertAndSend(destinationName, obj);
} else {
jmsTemplate.convertAndSend(destinationName, obj);
}
}

0 0
原创粉丝点击