ssm+rabbit 简单搭建,消费者+生产者

 

名词理解 Broker:简单来说就是消息队列服务器实体。   

Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。  

Queue:消息队列载体,每个消息都会被投入到一个或多个队列。   

Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起 来。  

Routing Key:路由关键字,exchange根据这个关键字进行消息投递。   

vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权 限分离。  

producer:消息生产者,就是投递消息的程序。  

consumer:消息消费者,就是接受消息的程序。

消息队列的使用过程大概如下:   

(1)客户端连接到消息队列服务器,打开一个channel。   

(2)客户端声明一个exchange,并设置相关属性。   

(3)客户端声明一个queue,并设置相关属性。   

(4)客户端使用routing key,在exchange和queue之间建立好绑定关 系。   

(5)客户端投递消息到exchange

融入项目:先搭建普通的ssm框架

          1.更改web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<!-- spring 监听 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    		classpath:spring-base.xml,
    		classpath:spring-producer.xml,
    		classpath:spring-common.xml
    </param-value>
  </context-param>

<!-- 
  	<servlet>  
    	<servlet-name>CXFServlet</servlet-name>  
    	<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
    	<load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>CXFServlet</servlet-name>  
        <url-pattern>/cxf/*</url-pattern>  
    </servlet-mapping>
 -->


  <servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>*.do</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

2.jar包坐标

	<dependency>
      <groupId>com.rabbitmq</groupId>
      <artifactId>amqp-client</artifactId>
      <version>4.0.0</version>
    </dependency>
 
    <dependency>
      <groupId>org.springframework.amqp</groupId>
      <artifactId>spring-rabbit</artifactId>
      <version>1.7.2.RELEASE</version>
    </dependency>

3. 创建生产者配置文件:spring-producer.xml

<?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:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/rabbit
    http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd">
 
    
    <bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" />
 
    <!-- 创建连接工厂  转入  ip 密码端口等 -->
    <rabbit:connection-factory id="mqconnectionFactory" host="127.0.0.1" port="5672"
            username="admin" password="admin"/>
 
 	<!-- 默认使用这个工厂 -->
    <rabbit:admin id="connectAdmin" connection-factory="mqconnectionFactory" />
 
    <!-- 给模板指定转换器 --><!-- mandatory必须设置true,return callback才生效 -->
    <rabbit:template id="amqpTemplate"   connection-factory="mqconnectionFactory"
        exchange="exchangeTest"
        />
 
    <!-- 创建一个队列 -->
    <!-- 
durable 是否持久化 
exclusive 仅创建者可以使用的私有队列,断开后自动删除 
auto-delete 当所有消费端连接断开后,是否自动删除队列 -->
<rabbit:queue id="buyCar" name="buyCar" durable="true" auto-delete="false"
exclusive="false" declared-by="connectAdmin" />



<rabbit:queue id="buyHouse" name="buyHouse" durable="true" auto-delete="false"
exclusive="false" declared-by="connectAdmin" />

<!-- 
交换机:一个交换机可以绑定多个队列,一个队列也可以绑定到多个交换机上。
如果没有队列绑定到交换机上,则发送到该交换机上的信息则会丢失。

direct模式:消息与一个特定的路由器完全匹配,才会转发
topic模式:按规则转发消息,最灵活
-->
<rabbit:direct-exchange name="exchangeTest"
durable="true" auto-delete="false" declared-by="connectAdmin">

<!-- bind:绑定 -->
<rabbit:bindings>
	<rabbit:binding queue="buyCar" key="buyCarKey"></rabbit:binding>
	<rabbit:binding queue="buyHouse" key="buyHouseKey"></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange>


  
 </beans>

4.在controller层写代码(发消息的代码 )

package com.mr.controller;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {

	// 注入amqpTemplate 模板类
	@Autowired
	private AmqpTemplate amqpTemplate;

	@RequestMapping("/test/toTest")
	public void toTest(Object msg) {
		// 指定key 和要传从参数,
		amqpTemplate.convertAndSend("buyCarKey", "id=3");
		amqpTemplate.convertAndSend("buyHouseKey", "id=4");
		System.err.println("进入test方法");
	}
}

5.消费者(继续创建一个相同的maven项目,搭建好ssm框架)jar包同上

     更改 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<!-- spring 监听 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    		classpath:spring-base.xml,
    		classpath:spring-consumer.xml,
    		classpath:spring-common.xml
    </param-value>
  </context-param>
 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

6.消费者pom.xml配置文件,父节点版本号有改动,spring版本号不能低于4.0,否则少一个工具包,其他无所谓,我这里使用的是4.2.3

 

<!-- 父节点 引入jar包    子节点  使用 -->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- spring版本号 -->  
        <spring.version>4.2.3.RELEASE</spring.version>  
        <!-- mybatis版本号 -->  
        <mybatis.version>3.2.6</mybatis.version>  
        <!-- log4j日志文件管理包版本 -->  
        <slf4j.version>1.7.7</slf4j.version>  
        <log4j.version>1.2.17</log4j.version>  
    </properties>

7.创建消费者配置文件:spring-consumer.xml

 

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:rabbit="http://www.springframework.org/schema/rabbit"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
http://www.springframework.org/schema/rabbit 
http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd">

	<!--配置connection-factory,指定连接rabbit server参数 -->
	<rabbit:connection-factory id="connectionFactory"
		username="admin" password="admin" host="127.0.0.1" port="5672" />

	<!-- 消息接收者 -->
	<bean id="buyCarListener" class="com.mr.jms.BuyCarListener"></bean>
	<bean id="buyHouseListener" class="com.mr.jms.BuyHouseListener"></bean>

	<!-- 声明队列 -->
	<rabbit:queue id="buyCar" name="buyCar" durable="true"
		auto-delete="false" exclusive="false" />
	<rabbit:queue id="buyHouse" name="buyHouse" durable="true"
		auto-delete="false" exclusive="false" />

	<!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
	<rabbit:listener-container
		connection-factory="connectionFactory">
		<rabbit:listener queues="buyCar" ref="buyCarListener" />
		<rabbit:listener queues="buyHouse" ref="buyHouseListener" />
	</rabbit:listener-container>


</beans>

8.监听执行类包结构

9.BuyCarListener.java

package com.mr.jms;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.beans.factory.annotation.Autowired;

import com.mr.service.TestService;
/**
 * 这是监听类,当有消息事,执行这个方法
 * @author Administrator
 *
 */
public class BuyCarListener  implements MessageListener{

	@Autowired
	private TestService testService;
	@Override
	public void onMessage(Message message) {
//		message.getBody() 获得参数
		// TODO Auto-generated method stub
		System.err.println("接受到消息,在处理。。。。。"+testService);
	}

}

10.BuyHouseListener.java

package com.mr.jms;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
/**
 * 这是监听类,当有消息事,执行这个方法
 * @author Administrator
 *
 */
public class BuyHouseListener  implements MessageListener{

	@Override
	public void onMessage(Message message) {
		// TODO Auto-generated method stub
		System.err.println("接受到买房消息,在处理。。。。。");
	}

}

 

11.TestService.java

package com.mr.service;

import org.springframework.stereotype.Service;

@Service
public class TestService {

}

 

出现权限问题:https://blog.csdn.net/luwei42768/article/details/53730960

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值