1.明白流程
exchange通过routingKey(一个规则)绑定着queue
。。。。。。。。。。。。。。。。。。。。。。。。。。。
用户指定:交换机,routingKey,消息。然后就可以把消息传给queue了。
开始:1.创建交换机
2。创建队列
3.通过routingKey绑定exchange和queue
这里routingKey注意一下:#是值:类似于order.abc.123的都可以绑定到(可以有多个“.”)。
还有一种是:*是值:类似于order.abc才能访问到(只能有一个“.”)
代码部分:
0.先写配置文件:
#rabbitMQ
spring.rabbitmq.addresses=127.0.0.1:5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=2000//超时时间为2s
1.创建一个entity:
@Data
public class TOrder implements Serializable {
@TableId
private String id;
private String name;
private String messageId;
}
这里注意,一定要继承Serializable接口,因为它要传输到网络上的。
2.写个把message发送出去的类和方法:
package com.van.mall.rabbitMQ.producer;
import com.van.mall.entity.TOrder;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author Van
* @date 2020/3/30 - 23:01
*/
@Component
public class OrderSender {
@Resource
private RabbitTemplate rabbitTemplate;
public void sent(TOrder tOrder){
CorrelationData correlationData=new CorrelationData();
correlationData.setId(tOrder.getId());
rabbitTemplate.convertAndSend(
"order-exchange",//exchange
"order.abcd",//routingKey
tOrder, //message content
correlationData //correlationData message id
);
}
}
开始测试:
@Test
public void test(){
TOrder tOrder=new TOrder();
tOrder.setId("20200320");
tOrder.setMessageId(UUID.randomUUID().toString());
tOrder.setName("test order NO.1");
orderSender.sent(tOrder);
}
能看到有一条消息产生L
点击队列后:
可看到消息.
消费者开始:
- properties文件:
#customer properties
spring.rabbitmq.listener.simple.concurrency=5
spring.rabbitmq.listener.simple.max-concurrency=10
spring.rabbitmq.listener.simple.acknowledge-mode=manual//手动签收
spring.rabbitmq.listener.simple.prefetch=1
消费者:
package com.van.mall.rabbitMQ.customer;
import com.rabbitmq.client.Channel;
import com.van.mall.entity.TOrder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @author Van
* @date 2020/3/30 - 23:54
*/
@Slf4j
@Component
public class OrderReceiver {
//监听queue:
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value ="order-queue",durable = "true"),
exchange = @Exchange(value = "order-exchange",durable = "true",type = "topic"),
key = "order.*"
)
)
//如果监听到了,那么执行这个方法
@RabbitHandler
public void onOrderMessage (@Payload TOrder tOrder, @Headers Map<String ,Object>headers, Channel channel)throws Exception{
log.info("-----------receive message-------------");
log.info("orderID:{}",tOrder.getId());
Long deliveryTag =(Long) headers.get(AmqpHeaders.DELIVERY_TAG);
//ACK
channel.basicAck(deliveryTag,false);
}
}
其实搞了这个注解,不用在上述的网站上创建exchange和queue了,这个注解全部搞定
:
启动后会看到:
我发出一个message然后自己又接受到这个message