new ConnectionFactory();异常

本文介绍了一个在运行RabbitMQ示例时遇到的问题:代码在newConnectionFactory后跳转到了finally分支,未捕获任何异常。通过添加slf4j jar包解决了这一问题,并分享了使用catch(Throwable e)来获取异常原因的小技巧。

运行rabbitMQ示例时, 遇到一个问题, 下面代码在newfactory后一直跳到finally分支, 看不到任何原因的exception.

其实是因为缺少slf4j jar包, 添加就可以了.  这里有一个小技巧, catch的时候 catch throwable类而不是Exception即可以看到异常原因.

        try {  

            factory = new ConnectionFactory();  
 factory.setHost("localhost");  
        } catch (Exception e) {  
            e.printStackTrace();  
        } catch (Throwable e) {  
            e.printStackTrace();  
        }finally{
@Slf4j @Configuration public class RabbitMqConfig { private final ConcurrentHashMap<String, SimpleMessageListenerContainer> listenerContainers = new ConcurrentHashMap<>(); @Autowired private ConfigurableApplicationContext context; @Autowired private RabbitTemplate rabbitTemplate; @Autowired private TMqConsumHistoryMapper tMqConsumHistoryMapper; @Autowired private TMqConfigMapper tMqConfigMapper; // 系统配置缓存 @CreateCache(name="DeviceCache_",cacheType = CacheType.LOCAL) private Cache<String, TSysConfig> sysConfigCache; @Bean public void setupDynamicRabbit() { String mqType = APPConfig.getMqType(); if (StringUtils.isBlank(mqType)|| !mqType.contains(CommonEnum.Mq_Type_RabbitMq.getName())){ return; } //mq的配置map,key为配置名称 Map<Long, TMqConfig> mqConfigMaps = tMqConfigMapper.selectList(new LambdaQueryWrapperX<TMqConfig>() .eq(TMqConfig::getStatus, CommonEnum.Enable.getCode()) .eq(TMqConfig::getType, CommonEnum.Mq_Type_RabbitMq.getName()) ).stream().collect(Collectors.toMap(TMqConfig::getId, Function.identity(), (v1, v2) -> v1)); if (CollectionUtil.isEmpty(mqConfigMaps)){ return; } TSysConfig tSysConfig = sysConfigCache.get(JetCacheConstants.SYSCONFIG_CACHE); for(Long id:mqConfigMaps.keySet()){ TMqConfig mqConfig = mqConfigMaps.get(id); //获取mq连接 ConnectionFactory connectionFactory = getConnectionFactory(mqConfig); rabbitTemplate.setConnectionFactory(connectionFactory); rabbitAdmin(connectionFactory); // try { // Properties queueProperties = rabbitAdmin.getQueueProperties(mqConfig.getTopic()); // if (queueProperties==null){ // log.error("队列不存在"); // } // } catch (Exception e) { // log.error("MQ连接异常",e); // } SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setMessageConverter(new org.springframework.amqp.support.converter.Jackson2JsonMessageConverter()); SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setQueueNames(mqConfig.getTopic()); container.setMessageListener(new MyRabbitMqMessageListener(mqConfig.getName(),tMqConsumHistoryMapper,tSysConfig)); container.setConnectionFactory(connectionFactory); container.setAcknowledgeMode(AcknowledgeMode.AUTO); container.start(); listenerContainers.put(mqConfig.getName(),container); } } public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){ RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); rabbitAdmin.setAutoStartup(true); try { connectionFactory.createConnection(); } catch (AmqpException e) { log.error("MQ连接异常",e); } return rabbitAdmin; } private ConnectionFactory getConnectionFactory(TMqConfig config){ CachingConnectionFactory connectionFactory = new CachingConnectionFactory(config.getIp()); connectionFactory.setPort(config.getPort()); connectionFactory.setUsername(config.getUsername()); connectionFactory.setPassword(config.getPassword()); connectionFactory.setVirtualHost(config.getVirtualHost()); connectionFactory.setRequestedHeartBeat(30); connectionFactory.addConnectionListener(new ConnectionListener() { @Override public void onCreate(Connection connection) { log.info("MQ连接建立成功,MQ地址如下:"+connection.getDelegate().getAddress().getHostAddress()); } @Override public void onClose(Connection connection) { log.error("和MQ的连接关闭,MQ地址如下:"+connection.getDelegate().getAddress().getHostAddress()); } }); return connectionFactory; } public void destroyMqListenerContainers(){ listenerContainers.forEach((k,v)->{ v.stop(); v.destroy(); }); listenerContainers.clear(); } //重新加载和MQ的连接 @Async("MQExecutor") public void restartMqConnection(){ //销毁所有监听器 destroyMqListenerContainers(); //销毁这个bean ((DefaultListableBeanFactory)context.getBeanFactory()).destroySingleton("setupDynamicRabbit"); //重新加载这个bean setupDynamicRabbit(); } } 这是我Java项目中一个动态配置监听rabbitmq的一个配置类,我有什么地方可以优化吗
06-12
rabbitmq连接配置 只需要在代码内配置连接池大小以及最大连接数调大 package com.xixikf.nanhang.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.xixikf.nanhang.config.properties.RabbitConfigInfo; import com.xixikf.nanhang.config.properties.SSORabbitConfigInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.Connection; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionListener; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.amqp.RabbitProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Rabbit 配置 * * @author: lijq * @date: 2023-05-30 */ @Configuration @Slf4j public class RabbitConfig { // 全局退出MQ连接工厂 @Bean(name = "ssoConnectionFactory") public ConnectionFactory ssoConnectionFactory(SSORabbitConfigInfo config) { CachingConnectionFactory factory = new CachingConnectionFactory(); factory.setAddresses(config.getAddresses()); factory.setUsername(config.getUsername()); factory.setPassword(config.getPassword()); factory.addConnectionListener(new ConnectionListener() { @Override public void onCreate(Connection connection) { log.info("连接创建成功: {}", connection); } @Override public void onClose(Connection connection) { log.warn("连接异常关闭: {}", connection); } }); return factory; } @Bean public RabbitAdmin rabbitAdmin(@Qualifier("ssoConnectionFactory") ConnectionFactory connectionFactory) { return new RabbitAdmin(connectionFactory); } @Bean(name = "ssoRabbitTemplate") public RabbitTemplate rabbitTemplate() { RabbitTemplate rabbitTemplate = new RabbitTemplate(this.ssoConnectionFactory(new SSORabbitConfigInfo())); rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter()); return rabbitTemplate; } @Bean(name="ssoListenerContainerFactory") public SimpleRabbitListenerContainerFactory uRabbitListenerContainerFactory( @Qualifier("ssoConnectionFactory") ConnectionFactory connectionFactory, RabbitProperties config ) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); return factory; } // JSON消息转换器 @Bean public MessageConverter jackson2JsonMessageConverter() { ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); mapper.registerModule(new JavaTimeModule()); return new Jackson2JsonMessageConverter(mapper); } }
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值