1.springboot 配置bean
@Configuration
public class RabbitMQConfig {
@Bean
public ConnectionFactory getFactory() {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setVirtualHost("/zwe-api");
return factory;
}
}
2.生产者
package top.zwsave.zweapi.task;
import com.rabbitmq.client.*;
import lombok.extern.java.Log;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.core.Queue;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import top.zwsave.zweapi.db.dao.SimpleMsgRefDao;
import top.zwsave.zweapi.db.pojo.SimpleMsgEntity;
import top.zwsave.zweapi.db.pojo.SimpleMsgRefEntity;
import top.zwsave.zweapi.db.pojo.SystemMsgEntity;
import top.zwsave.zweapi.exception.ZweApiException;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;
/**
* @Author: Ja7
* @Date: 2022-03-11 15:25
*/
@Log
@Component
public class FanoutMessageTask {
@Resource
ConnectionFactory factory;
public void send() {
try (Channel channel = factory.newConnection().createChannel()) {
channel.exchangeDeclare("exchangeName", BuiltinExchangeType.FANOUT);
String msg = "Hello --- Ja7"
HashMap hashMap = new HashMap();
hashMap.put("id", "10000");
AMQP.BasicProperties build = new AMQP.BasicProperties().builder().headers(hashMap).build(); // 设置头信息
channel.basicPublish("exchangeName", "", build, msg.getBytes("UTF-8"));
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
3.消费者
package top.zwsave.zweapi.task;
import com.rabbitmq.client.*;
import lombok.extern.java.Log;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.core.Queue;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import top.zwsave.zweapi.db.dao.SimpleMsgRefDao;
import top.zwsave.zweapi.db.pojo.SimpleMsgEntity;
import top.zwsave.zweapi.db.pojo.SimpleMsgRefEntity;
import top.zwsave.zweapi.db.pojo.SystemMsgEntity;
import top.zwsave.zweapi.exception.ZweApiException;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;
/**
* @Author: Ja7
* @Date: 2022-03-11 15:25
*/
@Log
@Component
public class FanoutMessageTask {
/**
* 自动签收, 并且只能接收一次:
* -> 一个队列,只读一个
* */
@Resource
ConnectionFactory factory;
public void receive() {
try (Channel channel = factory.newConnection().createChannel()){
channel.exchangeDeclare("exchangeName", "fanout");
channel.queueDeclare("queueName", false, false, false, null);
channel.queueBind("queue", "exchangeName", "");//把Queue、Exchange绑定
channel.basicQos(1);
Consumer callBack = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("=========业务代码========");
//路由的key
String routingKey = envelope.getRoutingKey();
//获取交换机信息
String exchange = envelope.getExchange();
//获取消息ID
long deliveryTag = envelope.getDeliveryTag();
// 获取头信息
String id = properties.getHeaders().get("id").toString();
//获取消息信息
String message = new String(body,"utf-8");
System.out.println(
"routingKey:" + routingKey +
",exchange:" + exchange +
",deliveryTag:" + deliveryTag +
",message:" + message);
channel.basicAck(envelope.getDeliveryTag(),false);
}
};
// 获取队列信息个数
AMQP.Queue.DeclareOk declareOk = channel.queueDeclarePassive(queueName);
int messageCount = declareOk.getMessageCount();
System.out.println("数量" + messageCount);
while (messageCount > 0) {
channel.basicConsume(queueName, false, callBack);
messageCount--;
}
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}