1、生产者
<!--配置connection-factory,指定连接rabbit server参数 -->
<rabbit:connection-factory id="connectionFactory"
host="${rabbit.connect.host}" port="${rabbit.connect.port}" username="${rabbit.connect.username}"
password="${rabbit.connect.password}" channel-cache-size="${rabbit.connect.channelCacheSize}"
publisher-returns="true" publisher-confirms="true" />
<!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
<rabbit:admin connection-factory="connectionFactory" />
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" />
<!--定义queue 说明:durable:是否持久化; auto_delete: 当所有消费客户端连接断开后,是否自动删除队列; exclusive: 仅创建者可以使用的私有队列,断开后自动删除 -->
<rabbit:queue name="mq.asdf" durable="true" auto-delete="false" exclusive="false" />
<rabbit:queue name="mq.asdf2" durable="true" auto-delete="false" exclusive="false" />
<rabbit:queue name="mq.qwer" durable="true" auto-delete="false" exclusive="false" />
<!--定义exchange路由规则,有以下四种路由规则
fanout-exchange:广播
topic-exchange:bingingkey 、routingkey模糊匹配
direct-exchange:bingingkey 、routingkey完全匹配(最常用)
headers-exchange:根据发送的消息内容中的headers属性进行匹配
-->
<!--定义topic-exchange -->
<rabbit:topic-exchange name="mq.asdfExChange" durable="true" auto-delete="false">
<rabbit:bindings>
<rabbit:binding queue="mq.asdf" pattern="mq.asdf.send"></rabbit:binding>
<rabbit:binding queue="mq.asdf2" pattern="mq.asdf2.send"></rabbit:binding>
<rabbit:binding queue="mq.asdf2" pattern="mq.asdf.send"></rabbit:binding>
</rabbit:bindings>
</rabbit:topic-exchange>
<!--定义direct-exchange -->
<rabbit:direct-exchange name="mq.qwerExChange" durable="true" auto-delete="false">
<rabbit:bindings>
<rabbit:binding queue="mq.qwer" key="mq.qwer.send" ></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange>
@Controller
@RequestMapping("/amqpTest")
public class AmqpTestController {
@Autowired
private AmqpTemplate amqpTemplate;
@RequestMapping("/sendMsg")
@ResponseBody
public String sendAmqbMsg(Model model,@RequestParam(value="msg",defaultValue="hello world!!!")String msg){
if(model!=null&&!"".equals(msg)){
//void convertAndSend(String exchange, String routingKey, Object message)
amqpTemplate.convertAndSend("mq.asdfExChange", "mq.asdf.send", msg);
}else{
amqpTemplate.convertAndSend("mq.asdfExChange", "mq.asdf.send", "hello world");
}
return "success";
}
@RequestMapping("/sendMsg2")
@ResponseBody
public String sendAmqbMsg2(Model model,@RequestParam(value="msg",defaultValue="hello world!!!")String msg){
if(model!=null&&!"".equals(msg)){
amqpTemplate.convertAndSend("mq.asdfExChange", "mq.asdf2.send", "这个世界很奇妙!!!");
}else{
amqpTemplate.convertAndSend("mq.asdfExChange", "mq.asdf2.send", "这个世界很奇妙");
}
return "success";
}
@RequestMapping("/sendMsg3")
@ResponseBody
public String sendAmqbMsg3(Model model,@RequestParam(value="msg",defaultValue="hello world!!!")String msg){
if(model!=null&&!"".equals(msg)){
amqpTemplate.convertAndSend("mq.qwerExChange", "mq.qwer.send", "神奇的世界!!!");
}else{
amqpTemplate.convertAndSend("mq.qwerExChange", "mq.qwer.send", "神奇的世界");
}
return "success";
}
}
2、消费者
<!--配置connection-factory,指定连接rabbit server参数 -->
<rabbit:connection-factory id="connectionFactory"
host="${rabbit.connect.host}"
port="${rabbit.connect.port}"
username="${rabbit.connect.username}"
password="${rabbit.connect.password}"
channel-cache-size="${rabbit.connect.channelCacheSize}"
publisher-returns="true"
publisher-confirms="true" />
<!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
<rabbit:admin connection-factory="connectionFactory" />
<!-- 不同'目的地'的消费者对象 -->
<bean id="asdfConsumer" class="com.demo.action.AsdfConsumer"></bean>
<bean id="asdfConsumer2" class="com.demo.action.AsdfConsumer2"></bean>
<bean id="qwerConsumer" class="com.demo.action.QwerConsumer"></bean>
<!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
<rabbit:listener-container connection-factory="connectionFactory" >
<rabbit:listener queues="mq.asdf" ref="asdfConsumer"/>
</rabbit:listener-container>
<rabbit:listener-container connection-factory="connectionFactory" >
<rabbit:listener queues="mq.asdf2" ref="asdfConsumer2"/>
</rabbit:listener-container>
<rabbit:listener-container connection-factory="connectionFactory" >
<rabbit:listener queues="mq.qwer" ref="qwerConsumer"/>
</rabbit:listener-container>
<!--
receive-timeout:等待接收超时时长 影响连接创建和销毁
concurrency:消费者个数
max-concurrency:最大消费者个数
min-start-interval:陆续启动 减少并发环境(或是三方系统突然的网络延迟) 大量连接导致的性能耗损
min-stop-interval:陆续销毁 减少突然的安静 导致大量可用连接被销毁
min-consecutive-active: 连续N次没有接收发生超时 则认定为需要创建 消费者
min-consecutive-idle: 连续N次发生了接收超时 则认定消费者需要销毁
prefetch:每个消费者预读条数 因为异步调用三方 性能瓶颈在网络与三方系统所以预读取条数设置为1(默认为5) 只有一条消息被ACK才会接收下一条消息
transaction-size:会影响prefetch的数量
-->
<!-- paycenter.notify.downstream 监听器 监听器各个参数的设置 -->
<rabbit:listener-container connection-factory="connectionFactory"
receive-timeout="30000"
concurrency="30"
max-concurrency="100"
min-start-interval="5000"
min-stop-interval="60000"
min-consecutive-active="2"
min-consecutive-idle="2"
prefetch="1"
transaction-size="1"
>
<rabbit:listener ref="notifyDownStreamConsumer" queue-names="paycenter.notify.downstream" />
</rabbit:listener-container>
public class AsdfConsumer implements MessageListener{
@Override
public void onMessage(Message message) {
MessageProperties m=message.getMessageProperties();
String msg= new String (message.getBody());
System.out.println("消费掉了:"+msg+"------->>>>>");
}
}