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;
- }
- }
测试文件:
- <pre name="code" class="java">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");
- }
- }
- </pre><br>
- <pre></pre>
- <br>
- <br>
- <br>
- <span style="white-space:pre"></span>
- <pre name="code" class="java"></pre>
- <br>
- <br>
- <span style="color:#ff0000">(注:在运行之前要先运行ActiveMQ)</span>