您的位置:首页 > 编程语言 > Java开发

Spring + JMS + ActiveMQ实现简单的消息队列(监听器异步实现)

2017-07-15 16:06 841 查看
消息队列存储机制(文件或数据库、broker cluster-代理集群)、同步方式 , 其他问题

首先声明:以下内容均是在网上找别人的博客综合学习而成的,可能会发现某些代码与其他博主的相同,由于参考的文章比较多,这里对你们表示感谢,就不一一列举,如果有侵权的地方,请通知我,我可以把该文章删除。

1、jms-xml Spring配置文件

[html]
view plain
copy

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  
    <bean id = "connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
        <property name = "brokerURL" value = "tcp://localhost:61616"/>  
    </bean>  
      
    <bean id = "topicDestination" class="org.apache.activemq.command.ActiveMQTopic"  
        autowire="constructor">  
        <constructor-arg value="com.spring.xkey.jms.topic"/>  
    </bean>  
    <bean id="sendMessage" class="com.spring.xkey.jms.SendMessage">  
        <property name="username" value="xkey"/>  
        <property name="password" value="1234567890"/>  
    </bean>  
    <bean id = "jmsMessageConverter" class="com.spring.xkey.jms.JmsMessageConverter">  
        <property name="sendMessage" ref="sendMessage"/>  
    </bean>  
    <!-- 创建JMS发送信息的模板的对象 -->    
    <bean id = "jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
        <property name="connectionFactory" ref="connectionFactory"/>  
        <!--property name="defaultDestination" ref="topicDestination"/-->  
        <property name="receiveTimeout" value="6000"/>  
        <property name="messageConverter" ref="jmsMessageConverter"/>  
    </bean>  
      
    <bean id = "jmsMessageListener" class="com.spring.xkey.jms.JmsMessageListener">  
    </bean>  
      
    <bean id = "publisher" class="com.spring.xkey.jms.Publisher">  
        <property name="jmsTemplate" ref="jmsTemplate"/>  
        <property name="destinations" ref="topicDestination" />  
        <property name="sendMessage" ref="sendMessage"/>  
          
    </bean>  
      
    <bean id = "consumer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
        <property name="connectionFactory" ref="connectionFactory"/>  
        <property name="destination" ref="topicDestination" />  
        <property name="messageListener" ref="jmsMessageListener" />  
    </bean>  
      
</beans>  

2、Listener代码

[java]
view plain
copy

package com.spring.xkey.jms;  
  
import java.util.Date;  
  
import javax.jms.JMSException;  
import javax.jms.Message;  
import javax.jms.MessageListener;  
  
import org.apache.activemq.command.ActiveMQMapMessage;  
  
public class JmsMessageListener implements MessageListener {  
  
    public void onMessage(Message message) {  
        ActiveMQMapMessage msg = null;  
        //System.out.println("ONMessage-----------------" + message.toString());  
        try {  
            if (message instanceof ActiveMQMapMessage) {  
                msg = (ActiveMQMapMessage) message;  
                String username = msg.getString("username");  
                String password = msg.getString("password");  
                System.out.println("Message::: "+username+", "+password);  
//              msg = (ActiveMQMapMessage) message;  
//              String sentDate = msg.getString("date");  
//              String reMessage = msg.getString("message");  
//              int sentCount = msg.getInt("count");  
//              System.out  
//                      .println("-------------New Message Arrival-----------"  
//                              + new Date());  
//              System.out.println("It's " + sentCount + " time From Darcy: "  
//                      + reMessage + "   ---Send time :" + sentDate);  
            }  
        } catch (JMSException e) {  
            System.out.println("JMSException in onMessage(): " + e.toString());  
        } catch (Throwable t) {  
            System.out.println("Exception in onMessage():" + t.getMessage());  
        }  
  
    }  
  
}  

3、Converter代码

[java]
view plain
copy

package com.spring.xkey.jms;  
  
import javax.jms.JMSException;  
import javax.jms.MapMessage;  
import javax.jms.Message;  
import javax.jms.Session;  
  
import org.springframework.jms.support.converter.MessageConversionException;  
import org.springframework.jms.support.converter.MessageConverter;  
  
public class JmsMessageConverter implements MessageConverter{  
  
    private SendMessage sendMessage;  
    public void setSendMessage(SendMessage sendMsg){  
        this.sendMessage = sendMsg;  
    }  
      
    public Object fromMessage(Message message) throws JMSException,  
            MessageConversionException {  
        // TODO Auto-generated method stub  
        MapMessage  mapmessage= (MapMessage)message;   
        this.sendMessage.setUsername(mapmessage.getString("username"));  
        this.sendMessage.setPassword(mapmessage.getString("password"));  
        System.out.println("First");  
        return sendMessage;  
    }  
  
    public Message toMessage(Object arg0, Session session) throws JMSException,  
            MessageConversionException {  
        // TODO Auto-generated method stub  
        this.sendMessage = (SendMessage)arg0;  
        MapMessage  mapmessage= (MapMessage) session.createMapMessage();  
        mapmessage.setString("username", this.sendMessage.getUsername());  
        mapmessage.setString("password", this.sendMessage.getPassword());  
        System.out.println("Second");  
        return mapmessage;  
    }  
  
}  

4、Publisher代码

[cpp]
view plain
copy

package com.spring.xkey.jms;  
  
import java.util.Scanner;  
  
import javax.jms.Destination;  
  
import org.springframework.jms.core.JmsTemplate;  
  
public class Publisher {  
    private JmsTemplate template;  
    private Destination[] destinations;  
    private SendMessage sendMessage;  
   
    public void chart()  
    {  
        boolean chart = true;  
        int count = 0;  
        while(chart)  
        {  
            count ++;  
            Scanner cin=new Scanner(System.in);  
            System.out.println("输入聊天内容,输入N停止聊天");  
            String text=cin.nextLine();  
            if(text.equals("N"))  
            {  
                chart = false;  
            }  
            System.out.println("我:"+text);  
            sendChartMessage(count,text);  
        }  
   
    }  
    public void sendMsgCon(){  
        Scanner cin=new Scanner(System.in);  
        String username = cin.nextLine();  
        String password = cin.nextLine();  
        this.sendMessage.setUsername(username);  
        this.sendMessage.setPassword(password);  
        sendConvertor(this.sendMessage);  
    }  
      
    public void sendConvertor(SendMessage sendMsg){  
        template.convertAndSend(destinations[0],sendMsg);  
    }  
      
    protected void sendChartMessage(int count , String strMessage)  
    {  
        MyMessageCreator creator = new MyMessageCreator(count,strMessage);  
        template.send(destinations[0], creator);  
    }  
   
    public JmsTemplate getJmsTemplate() {  
        return template;  
    }  
   
    public void setJmsTemplate(JmsTemplate template) {  
        this.template = template;  
    }  
   
    public Destination[] getDestinations() {  
        return destinations;  
    }  
   
    public void setDestinations(Destination[] destinations) {  
        this.destinations = destinations;  
    }  
      
    public void setSendMessage(SendMessage sendMsg){  
        this.sendMessage = sendMsg;  
    }  
    public SendMessage getSendMessage(){  
        return this.sendMessage;  
    }  
}  

5、SendMessage代码

[java]
view plain
copy

package com.spring.xkey.jms;  
  
public class SendMessage {  
    private String username;  
    private String password;  
      
    public void setUsername(String user){  
        this.username = user;  
    }  
    public void setPassword(String pass){  
        this.password = pass;  
    }  
      
    public String getUsername(){  
        return this.username;  
    }  
    public String getPassword(){  
        return this.password;  
    }  
}  

6、Test类

[java]
view plain
copy

package com.spring.xkey.jms;  
  
import javax.jms.JMSException;  
  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
import org.springframework.jms.listener.DefaultMessageListenerContainer;  
  
public class Test {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        ApplicationContext context =   
            new ClassPathXmlApplicationContext("jms.xml");  
        /**Sender sender = (Sender)context.getBean("sender"); 
        sender.SendInfo(); 
        Receiver receiver = (Receiver)context.getBean("receiver"); 
        try { 
            System.out.println(receiver.receiverInfo()); 
             
        } catch (JMSException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        }*/  
        Publisher pub = (Publisher)context.getBean("publisher");  
        DefaultMessageListenerContainer consumer =   
            (DefaultMessageListenerContainer)context.getBean("consumer");  
        consumer.start();  
        pub.sendMsgCon();  
        //pub.chart();  
    }  
  
}  

JMS还是有很多东西不会的,JMS的事务没考虑,还有一些比较高级的应用,关于Spring JMS的全部知识点在下面这个链接应该全部体现了:http://www.javawind.net/help/html/spring_ref_2.0/html/jms.html点击打开链接
http://blog.csdn.net/acceptedxukai/article/details/7775746
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: