SpringBoot 整合ActiveMq自动重连

SpringBoot 整合ActiveMq自动重连

启动类添加注解:@EnableJms

1 pom

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
            <version>1.5.7.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
        </dependency>

2 application.properties

activemq.url=tcp://127.0.0.1:61616
activemq.user=admin
activemq.password=admin

3 初始化对象配置

@Configuration
public class BeanConfig {

    @Value("${activemq.url}")
    private String ActiveMQ_URL;
    @Value("${activemq.user}")
    private String ActiveMQ_USER;
    @Value("${activemq.password}")
    private String ActiveMQ_PASSWORD;

/**
   @Bean
    public ConnectionFactory connectionFactory() {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        connectionFactory.setBrokerURL(ActiveMQ_URL);
        connectionFactory.setUserName(ActiveMQ_USER);
        connectionFactory.setPassword(ActiveMQ_PASSWORD);
        return connectionFactory;
    } */
    
   /**
     * 参考介绍:https://www.cnblogs.com/xingzc/p/5943165.html
     * @return 解决activeMq 一直创建连接的问题
     */
    @Bean("connectionFactory")
    public CachingConnectionFactory connectionFactory(){
        ActiveMQConnectionFactory amqFactory = new ActiveMQConnectionFactory(ActiveMQ_USER, ActiveMQ_PASSWORD, ActiveMQ_URL);
        CachingConnectionFactory ccf = new CachingConnectionFactory(amqFactory);
        ccf.setSessionCacheSize(50);
        ccf.setCacheProducers(true);
        return ccf;
    }

    @Bean
    public ConvertJmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
        ConvertJmsTemplate jmsTemplate = new ConvertJmsTemplate();
        jmsTemplate.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//进行持久化配置 1表示非持久化,2表示持久化
        jmsTemplate.setConnectionFactory(connectionFactory);
        jmsTemplate.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);//客户端签收模式
        return jmsTemplate;
    }

    @Bean
    public JmsMessagingTemplate jmsMessageTemplate(ConnectionFactory connectionFactory) {
        return new JmsMessagingTemplate(connectionFactory);
    }


    // 自动设置JMS重连JmsListenerContainerFactory
    @Bean
    public JmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory jmsListenerFactory = new DefaultJmsListenerContainerFactory();
        jmsListenerFactory.setPubSubDomain(false);
        jmsListenerFactory.setConnectionFactory(connectionFactory);
        return jmsListenerFactory;
    }

    @Bean
    public Session createConnSession(ConnectionFactory connectionFactory) throws JMSException {
        Connection conn = connectionFactory.createConnection();
        Session session = (ActiveMQSession)conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
        conn.start();
        return session;
    }

  • ConvertJmsTemplate.java
    解决生产者producer多次重连断开的问题
import org.apache.activemq.command.ActiveMQQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.JmsUtils;

import javax.jms.MessageProducer;
import javax.jms.Session;
import java.util.Objects;

public class ConvertJmsTemplate extends JmsTemplate {

    private Logger logger = LoggerFactory.getLogger(ConvertJmsTemplate.class);

    @Autowired
    private Session session;

    private MessageProducer producer;

    public void sendQueue(ActiveMQQueue queue, final Object message) {
        try {
            if (Objects.isNull(producer)) {
                producer = super.createProducer(session, queue);
            }
            doSend(producer, super.getMessageConverter().toMessage(message, session));
            // Check commit - avoid commit call within a JTA transaction.
            if (session.getTransacted() && isSessionLocallyTransacted(session)) {
                // Transacted session created by this template -> commit.
                JmsUtils.commitIfNecessary(session);
            }
        } catch (Exception e) {
            logger.error("error {}", e);
        }
    }


}

4 生产者与消费者

@JmsListener:注解默认支持自动重连机制

  • 消费者
@Component
public class Consumer {

    /*
     * 监听和读取消息
     */
    @JmsListener(destination = "active.topic")
    public void readActiveTopic(String message) {
        System.out.println("接受到2:" + message);
    }
}
  • 生产者
@RestController
public class ProducerController {
	@Autowired
	private JmsMessagingTemplate jmsMessagingTemplate;
 
	@Autowired
	private Queue queue;
 
	/*
	 * 消息生产者
	 */
	@RequestMapping("/sendmsg")
	public void sendmsg(String msg) {
		// 指定消息发送的目的地及内容
		this.jmsMessagingTemplate.convertAndSend(this.queue, msg);
	}

}

5 扩展

5.1 自定义动态监听器

  1. ConnectionDefaultListener
public class ConnectionDefaultListener {

    private Logger logger = LoggerFactory.getLogger(ConnectionDefaultListener.class);
    
    // 消费者
    private MessageConsumer messageConsumer;

    // 连接工厂
    ConnectionFactory connectionFactory;
    
    // 连接对象
    private Connection conn;

    // session
    private Session session;

    private Boolean isRunning = true;

    // 连接信息
    private ConnectMqtt connectMqtt;

    // 监听器
    private MessageListener messageListener;

    // ConnectMqtt  业务参数
    public ConnectionDefaultListener(ConnectionFactory connectionFactory, ConnectMqtt connectMqtt) throws Exception {
        this.connectMqtt = connectMqtt;
        this.connectionFactory = connectionFactory;
        this.messageListener = new MyJmsListenerConsumer(connectMqtt);
        createConnect();
        createConnSession();
    }

    /**
     * 创建新连接
     */
    private void createConnect() throws Exception {
        this.conn = connectionFactory.createConnection();
        this.conn.start();


    }

    public void start() throws Exception {
        // 注册messageConsumer
        registerMessageConsumer();
        // 5S执行一次
        new JmsListenerThread().registerConnectionDefaultListener(this);

    }

    /**
     * 注册MessageConsumer
     */
    private void registerMessageConsumer() {
        try {
            // 设置监听的队列名称
            Destination destination = this.session.createQueue(connectMqtt.getQueue());
            // 创建一个消费者
            MessageConsumer consumer = this.session.createConsumer(destination);
            addMessageConsumer(consumer);
            this.isRunning = Boolean.TRUE;
            logger.info("activeMq create success, destination: {}", connectMqtt.getQueue());
        } catch (Exception e) {
            logger.error("jms监听器创建失败Exception: {}", e);
            logger.error("jms监听器创建失败: {}", connectMqtt.getQueue());
        }
    }


    /**
     * 添加客户端
     *
     * @param consumer
     */
    public void addMessageConsumer(MessageConsumer consumer) {
        if (this.messageConsumer != null) {
            // 手动清除对象
            this.messageConsumer = null;
        }
        this.messageConsumer = consumer;
    }

    /**
     * 创建session
     *
     * @return
     * @throws JMSException
     */
    public void createConnSession() throws JMSException {
        Session session = this.conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
        this.session = session;
    }


    /**
     * 校验是否建立连接
     * 没连接抛出异常
     *
     * @param timeout
     * @return
     * @throws JMSException
     */
    protected Message receiveFromConsumer(long timeout) throws JMSException {
        if (timeout > 0L) {
            return this.messageConsumer.receive(timeout);
        } else {
            return timeout < 0L ? this.messageConsumer.receiveNoWait() : this.messageConsumer.receive();
        }
    }


    /**
     * 消费消息
     *
     * @param message
     */
    public void messageInvoke(Message message) {
        try {
            this.messageListener.onMessage(message);
        } catch (Exception e) {
            logger.error("messageInvoke error {}", e);
        }
    }

    /**
     * 重连逻辑
     */
    public synchronized void releaseConnection() {
        if (isRunning) {
            return;
        }
        try {
            close();
            // 创建连接
            createConnect();
            // 创建session
            createConnSession();
            // 创建队列
            registerMessageConsumer();
            this.isRunning = Boolean.TRUE;
        } catch (Exception e) {
            logger.error("jms releaseConnect error {}", e);
        }

    }

    // 关闭 连接
    public void close() {
        try {
            if (null != this.messageConsumer) {
                this.messageConsumer.close();
            }
            if (null != this.session) {
                session.close();
            }
            if (null != this.conn) {
                this.conn.close();
            }
        } catch (Exception e) {
            logger.error("close error:{}", e);
        }


    }
}

/**
 * 自定义JMS监听
 */
public class MyJmsListenerConsumer implements MessageListener {

    private Logger logger = LoggerFactory.getLogger(MyJmsListenerConsumer.class);

    private ConnectMqtt connectMqtt;

    public MyJmsListenerConsumer(ConnectMqtt connectMqtt) {
        this.connectMqtt = connectMqtt;
    }

    @Override
    public void onMessage(Message message) {

        try {
            //接收文本消息
            if (message instanceof TextMessage) {
                TextMessage text = (TextMessage) message;
                logger.info("ActiveMq 接收消息: {}", text.getText());
                ...业务逻辑
                logger.info("process end");
            } else {
                logger.warn("消息不支持接受");
            }
        } catch (Exception e) {
            // 报错日志;
            logger.error("error: {}", e.getMessage());
        }
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要配置Spring Boot整合ActiveMQ,你可以按照以下步骤进行操作: 1. 添加ActiveMQ依赖: 在你的项目中的pom.xml文件中,添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> ``` 2. 配置ActiveMQ连接信息: 在你的application.properties或application.yml文件中,添加以下配置: ``` spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.user=admin spring.activemq.password=admin ``` 这里,你需要设置ActiveMQ的通信地址,以及账户名和密码。 3. 配置队列或主题模式: 默认情况下,ActiveMQ提供的是队列模式。如果你想使用主题模式,可以添加以下配置: ``` spring.jms.pub-sub-domain=true ``` 4. 启动ActiveMQ服务器: 你需要启动ActiveMQ服务器来进行消息的发送和接收。可以通过在浏览器中访问http://localhost:8161,使用管理员账户名和密码(admin/admin)登录ActiveMQ管理界面来启动服务器。 这样,你就可以在Spring Boot项目中成功配置和使用ActiveMQ了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java springboot整合activemq工程](https://download.csdn.net/download/weixin_47315082/88136003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Springboot整合ActiveMQ](https://blog.csdn.net/weixin_45698637/article/details/123443728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [《SpringBoot篇》25.SpringBoot整合ActiveMQ](https://blog.csdn.net/weixin_47343544/article/details/128164353)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值