@AllArgsConstructor
public class DirectProducer {
private final RabbitTemplate myRabbitTemplate;
private final String exchange;
private final String routerKey;
public void sendMessageByDirect(String content) {
Message message = MessageBuilder.withBody(content.getBytes())
.setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN)
.setContentEncoding("utf-8")
.setExpiration("2000000")
.build();
myRabbitTemplate.convertAndSend(
exchange,
routerKey,
message);
}
}
/**
* @author long 2021/5/23
*/
@Component
@Slf4j
public class RabbitMQConfig {
public static DirectProducer initRabbitMQInstance(String host,
Integer port,
String username,
String password,
String virtualHost,
String exchange,
String queue,
String routerKey) {
CachingConnectionFactory connectionFactory = RabbitMQConfig.hospSyncConnectionFactory(host, port, username, password, virtualHost);
RabbitTemplate rabbitTemplate = RabbitMQConfig.rabbitTemplate(connectionFactory,true);
RabbitMQConfig.hospSyncFactory(connectionFactory, "manual", 5);
RabbitAdmin rabbitAdmin = RabbitMQConfig.rabbitAdmin(connectionFactory);
initExchangeAndQueue(rabbitAdmin, exchange, queue, routerKey);
return new DirectProducer(rabbitTemplate, exchange, routerKey);
}
public static void initExchangeAndQueue(RabbitAdmin rabbitAdmin,
String exchange,
String queue,
String routerKey) {
rabbitAdmin.declareExchange(new DirectExchange(exchange, true, false));
rabbitAdmin.declareQueue(new Queue(queue, true));
rabbitAdmin.declareBinding(
BindingBuilder
.bind(new Queue(queue, true)) //直接创建队列
.to(new DirectExchange(exchange, true, false)) //直接创建交换机 建立关联关系
.with(routerKey)); //指定路由Key
}
public static CachingConnectionFactory hospSyncConnectionFactory(String host, int port, String username, String password, String virtualHost){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualHost);
connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED);
connectionFactory.setPublisherReturns(true);
return connectionFactory;
}
public static RabbitTemplate rabbitTemplate(
ConnectionFactory connectionFactory,
Boolean mandatory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMandatory(mandatory);
rabbitTemplate.setConfirmCallback((correlationData, ack, s) -> {
if (!ack) {
log.info("发送RabbitMQ消息 ack确认 失败");
} else {
log.info("发送RabbitMQ消息 ack确认 成功");
}
});
rabbitTemplate.setReturnCallback((message, code, replyText, exchange, routingKey) -> {
log.error("发送RabbitMQ消息returnedMessage,出现异常,Exchange不存在或发送至Exchange却没有发送到Queue中,message:[{}], code[{}], replyText[{}], exchange[{}], routingKey[{}]", message, code, replyText, exchange, routingKey);
});
return rabbitTemplate;
}
public static void hospSyncFactory(
ConnectionFactory connectionFactory,
String acknowledge,
Integer prefetch) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setAcknowledgeMode(AcknowledgeMode.valueOf(acknowledge.toUpperCase()));
factory.setPrefetchCount(prefetch);
}
public static RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
public static void main(String[] args) {
SpringApplication.run(RabbitmqApplication.class, args);
String host ="IP地址" ;
int port = 端口;
String username = "用户名";
String password = "密码";
String virtualHost= "/";
String exchange = "exchange";
String queue = "queue";
String routerKey = "routerKey";
DirectProducer directProducer = RabbitMQConfig.initRabbitMQInstance(host, port, username, password, virtualHost, exchange, queue, routerKey);
directProducer.sendMessageByDirect("测试消息");
}
个人博客: