SpringBoot动态连接RabbitMQ,连接多个RabbitMQ服务

@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("测试消息");

}

个人博客:

恋萌https://koimoe.com/

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值