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

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

1、jms-xml Spring配置文件

<?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代码

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代码

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代码

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代码
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类
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点击打开链接

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值