spingboot集成ActiveMQ

回顧

第一篇:mac下安裝ActiveMQ
第二篇:ActiveMQ兩種模式

集成步驟

1、引入依賴

<!--後面兩個依賴可以根據實際情況引入-->
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
             <version>5.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.messaginghub</groupId>
            <artifactId>pooled-jms</artifactId>
            <version>1.0.3</version>
        </dependency>

2、在application.properties中配置

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.in-memory=false
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=5
spring.activemq.pool.idle-timeout=30s

3、在java類中配置

@Configuration
@EnableJms
public class Application {
 @Bean
    public Queue queue(){
        return new ActiveMQQueue();
    }

    @Bean
    public RedeliveryPolicy redeliveryPolicy(){
        RedeliveryPolicy  redeliveryPolicy=   new RedeliveryPolicy();
        //是否在每次嘗試重新發送失敗後,增長這個等待時間
        redeliveryPolicy.setUseExponentialBackOff(true);
        //重發次數,默認爲6次   這裏設置爲10次
        redeliveryPolicy.setMaximumRedeliveries(10);
        //重發時間間隔,默認爲1秒
        redeliveryPolicy.setInitialRedeliveryDelay(1);
        //第一次失敗後重新發送之前等待500毫秒,第二次失敗再等待500 * 2毫秒,這裏的2就是value
        redeliveryPolicy.setBackOffMultiplier(2);
        //是否避免消息碰撞
        redeliveryPolicy.setUseCollisionAvoidance(false);
        //設置重發最大拖延時間-1 表示沒有拖延只有UseExponentialBackOff(true)爲true時生效
        redeliveryPolicy.setMaximumRedeliveryDelay(-1);
        return redeliveryPolicy;
    }

    @Bean
    public ActiveMQConnectionFactory connectionFactory(){
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        connectionFactory.setBrokerURL("tcp://localhost:61616");
        connectionFactory.setUserName("admin");
        connectionFactory.setPassword("admin");
        return connectionFactory;
    }

    @Bean
    JmsListenerContainerFactory<?> queueFactory(ConnectionFactory connectionFactory){
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(false);
        return factory;
    }

    @Bean
    public JmsTemplate jmsTemplate(ActiveMQConnectionFactory activeMQConnectionFactory,Queue queue){
        JmsTemplate jmsTemplate=new JmsTemplate();
        //定義持久化後節點掛掉以後,重啓可以繼續消費.NON_PERSISTENT 表示非持久化,PERSISTENT 表示持久化
        jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);
        jmsTemplate.setConnectionFactory(activeMQConnectionFactory);
        jmsTemplate.setDefaultDestination(queue); //此處可不設置默認,在發送消息時也可設置隊列
        jmsTemplate.setSessionAcknowledgeMode(4);//客戶端簽收模式
        return jmsTemplate;
    }


    @Bean(name = "jmsQueueListener")
    public DefaultJmsListenerContainerFactory jmsQueueListenerContainerFactory(ActiveMQConnectionFactory activeMQConnectionFactory) {
        DefaultJmsListenerContainerFactory factory =
                new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(activeMQConnectionFactory);
        //設置連接數
        factory.setConcurrency("1-10");
        //重連間隔時間
        factory.setRecoveryInterval(1000L);
        factory.setSessionAcknowledgeMode(4);
        return factory;
    }
 }

這邊配置了很多屬性,包括連接池和簽收屬性,着重說一下簽收模式。客戶端簽收模式有如下幾種:

  1. AUTO_ACKNOWLEDGE = 1 自動確認
  2. CLIENT_ACKNOWLEDGE = 2 客戶端手動確認
  3. DUPS_OK_ACKNOWLEDGE = 3 自動批量確認
  4. SESSION_TRANSACTED = 0 事務提交併確認
  5. INDIVIDUAL_ACKNOWLEDGE = 4 單條消息確認 activemq 獨有

消費者客戶端成功接收一條消息一般包括三個階段:

  1. 消費者接收消息,也即從MessageConsumer的receive方法返回
  2. 消費者處理消息
  3. 消息被簽收

4、生產者

@RestController
public class TaskController {
  @Autowired
    private JmsTemplate jmsTemplate;
    Destination Destination = new ActiveMQQueue("testDestination");
    @Autowired
    public TaskController(JmsTemplate template) {
        this.jmsTemplate = template;
    }
     @RequestMapping(value = "/test", method = RequestMethod.POST)
    @ResponseBody
    public String test(@RequestBody String body) throws JSONException {
        String qMessage = "test";
        jmsTemplate.convertAndSend(Destination, qMessage);
        return "success";
    }

5、消費者

    @JmsListener(destination = "testDestination", containerFactory = "jmsQueueListener")
    public void receiveQueue(final TextMessage text, Session session)
            throws JMSException {
        try {
            logger.debug("Consumer收到的報文爲:" + text.getText());
            text.acknowledge();// 使用手動簽收模式,需要手動的調用,如果不在catch中調用session.recover()消息只會在重啓服務後重發
        } catch (Exception e) {    
            session.recover();// 此不可省略 重發信息使用
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章