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)