JMS+spring中的简单应用(demo)

JMS两个主要概念:

消息中介

消息目标:

1、队列

2、主题

两种传递模式:

点对点消息传递模型:每个消息都有一个发送者和一个消费者    
发送者-〉队列-〉接受者
发布-订阅者消息传递模型:一条订阅信息,可以发送给多个订阅者
发布者-〉主题-〉订阅者们

JMS优点:

不用等待
面向消息
位置独立
确保投送

ActiveQM:开源消息中介。

Spring中安装ActiveMQ

创建连接工厂:

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
 <property name = "brokerURL" value="tcp://localhost:61616"/>
</bean>
声明ActiveMQ消息目标:消息目标可以是队列,也可以是主题。
队列:
<bean id="mqiqeDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="mqiqe.queue"/>
</bean>
主题:
<bean id="mqiqeDestination" class="org.apache.activemq.command.ActiveMQTopic">
  <constructor-arg index="0" value="mqiqe.topic"/>
</bean>

使用JMS模板:

JmsTemplate是Spring消除冗长和重复JMS代码解决方案。
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  <property name="connectionFactory" ref="connectionFactory"/>
  <!--注入默认消息目标-->
  <property name="defaultDestination" ref="mqiqeDestination"/>
</bean>

发送消息:

jmsTemplate.send(destination, messageCreator);方法发送消息 destination:目标 ,messageCreator: 消息。
发送者——〉send(JmsTemplate)——〉队列/主题

消费消息:

MapMessage message=(MapMessage)jmsTemplate.receive(destination);方法接受消息 destination:目标 ,MapMessage: 消息。
队列/主题-〉(recive)JmsTemplate-〉Receiver

Demo代码

spring配置文件:

   <!-- ActiveMQ -->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
 <property name = "brokerURL" value="tcp://localhost:61616"/>
</bean>
<bean id="mqiqeDestination" class="org.apache.activemq.command.ActiveMQQueue">
   <constructor-arg index="0" value="mqiqe.queue"/>
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  <property name="connectionFactory" ref="connectionFactory"/>
   <property name="defaultDestination" ref="mqiqeDestination"/>
</bean>
<bean id="mqiqeSend" class="com.activemq.MqiqeSendImpl">
  <property name="jmsTemplate" ref="jmsTemplate"/>
</bean>
<bean id="mqiqeReceiver" class="com.activemq.MqiqeReceiverImpl">
  <property name="jmsTemplate" ref="jmsTemplate"/>
</bean>


接口文件:

package com.activemq;


import javax.jms.JMSException;


public interface IMqiqeReceiver {
public String reveiver() throws JMSException;
}
package com.activemq;


public interface IMqiqeSend {
public void send(final String  messageStr);
}


类文件:

package com.activemq;


import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;


import org.springframework.jms.core.JmsTemplate;


public class MqiqeReceiverImpl implements IMqiqeReceiver {
@Override
public String reveiver() throws JMSException {
System.out.println("开始接受信息。。。");
MapMessage message = (MapMessage) jmsTemplate.receive();
String str = "lastName:" + message.getString("lastName") + "firstName:"
+ message.getString("firstName") + "messageStr:"
+ message.getString("messageStr");
System.out.println("接受完信息。。。");
return str;
}


private JmsTemplate jmsTemplate;


/**
* @param jmsTemplate
*            the jmsTemplate to set
*/
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
}


package com.activemq;


import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;


import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;


public class MqiqeSendImpl implements IMqiqeSend {

@Override
public void send (final String motorist){
jmsTemplate.send(
new MessageCreator(){
public Message createMessage(Session session) throws JMSException{
MapMessage message =session.createMapMessage();
message.setString("lastName", "fg\n");
message.setString("firstName", "mqiqe\n");
message.setString("messageStr", motorist);
return message;
}
});
}
private JmsTemplate jmsTemplate;
/**
* @param jmsTemplate the jmsTemplate to set
*/
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
}


测试文件:

package com.activemq;

import javax.jms.JMSException;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class TestActiveMQ {
	static String context = null;
	static ApplicationContext applicationContext;
	static {
		context = "applicationContext.xml";

	}

	public static void main(String[] arg) {
		System.out.println("start---");
		applicationContext = new ClassPathXmlApplicationContext(context);
		IMqiqeSend demoSend = (IMqiqeSend) applicationContext.getBean("mqiqeSend");
		IMqiqeReceiver mqiqeReceiver=  (IMqiqeReceiver)applicationContext.getBean("mqiqeReceiver");
		System.out.println(demoSend);
		demoSend.send("hello,world!");
		System.out.println("send Message:hello,world!");
		try {
			System.out.println(mqiqeReceiver.reveiver());
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("end");
	}
}








(注:在运行之前要先运行ActiveMQ)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ActiveMQ安装 : 1.下载:http://activemq.apache.org/download.html 最新Windows版本 2.配置jdk环境,解压ActiveMQ到本地 3.启动ActiveMQ服务器: 32位机 : 直接运行\bin\win32\activemq.bat 64位机 : 直接运行\bin\win64\activemq.bat 4.打开ActiveMQ消息管理后台系统 http://localhost:8161/admin/ 参考文章为 : HelloWorld : http://blog.csdn.net/baggio7095586/article/details/5708519 进阶 :http://haohaoxuexi.iteye.com/blog/1893038 helloworld阶段 : 一个发送消息的程序,一个接收消息的程序..实现最简单JMS交流... 监听器阶段 : ⑴MessageListener,最简单的监听器..只是拿来监听接收信息的 ⑵SessionAwareMessageListener,有个session的参数..可以拿来对接收到的信息再做响应.. ⑶MessageListenerAdapter,将消息委托交给一个普通的java类来处理.. 转化器阶段 : 实现MessageConverter接口来转换JMS对象与java对象.. 其实在使用MessageListenerAdapter时,Spring默认为我们提供了SimpleMessageConverter转换器.. 事务(无代码): 在Spring整合JMS应用,如果我们要进行本地的事务管理的话非常简单,只需要在定义对应的消息监听容器时指定其sessionTransacted属性为true,如: <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="queueDestination" /> <property name="messageListener" ref="consumerMessageListener" /> <property name="sessionTransacted" value="true"/> </bean> 该属性值默认为false,这样JMS在进行消息监听的时候就会进行事务控制,当在接收消息时监听器执行失败时JMS就会对接收到的消息进行回滚, 对于SessionAwareMessageListener在接收到消息后发送一个返回消息时也处于同一事务下,但是对于其他操作如数据库访问等将不属于该事务控制。 数据库跟JMS挂钩的事务先别理..
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值