ActiveMQ引入与使用

19 篇文章 0 订阅

 本文是结合过去几年中项目的mq中间件的使用,把activeMQ引入springboot项目的过程,还有实际过程中使用的范例,从消息发送到消息接收的代码例子都有,已经过两年大量数据考验,下面就是整个相关的代码,供初学者学习和使用参考。

  <!--activemq 消息中间件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
        </dependency>
#在springboot项目的application.yml的配置 默认的密码和端口 61616是mq通过tcp传输协议的通讯端口
#通过浏览器查看管理mq的 http://xx.xxx.xx.xx:8161/admin  
activemq:
  broker-url: tcp://xx.xxx.xx.xx:61616
  user: admin
  password: admin
  in-memory: false
  close-timeout: 5000
  packages:
    trust-all: false
@Configuration
@EnableJms
public class JmsConfig {

    /**
     * 操作xxxxx数据
     * @return
     */
    @Bean
    public Queue xxxxxData() {
        return new ActiveMQQueue("xxxxxData");
    }

    /**
     * 普通方式实现
     *
     * @param brokerUrl
     * @param userName
     * @param password
     * @return
     */
    @Bean(name = "xxConnectionFactory1")
    public ActiveMQConnectionFactory getXxConnectionFactory(@Value("${activemq.broker-url}") String brokerUrl,
                                                              @Value("${activemq.user}") String userName, @Value("${activemq.password}") String password) {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        connectionFactory.setBrokerURL(brokerUrl);
        connectionFactory.setUserName(userName);
        connectionFactory.setPassword(password);
        return connectionFactory;
    }

    /**
     * 池方式实现
     *
     * @param brokerUrl
     * @param userName
     * @param password
     * @return
     */
    @Bean(name = "xxPoolConnectionFactory")
    public PooledConnectionFactory getXxPoolConnectionFactory(@Value("${activemq.broker-url}") String brokerUrl,
                                                                @Value("${activemq.user}") String userName, @Value("${activemq.password}") String password) {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        connectionFactory.setBrokerURL(brokerUrl);
        connectionFactory.setUserName(userName);
        connectionFactory.setPassword(password);

        PooledConnectionFactory cf = new PooledConnectionFactory(connectionFactory);
        //#连接池最大连接数
        cf.setMaxConnections(150);
        //空闲的连接过期时间,默认为30秒
        cf.setIdleTimeout(30000);
        //#强制的连接过期时间,与idleTimeout的区别在于:idleTimeout是在连接空闲一段时间失效,而expiryTimeout不管当前连接的情况,只要达到指定时间就失效。默认为0,never
        cf.setExpiryTimeout(0);
        return cf;
    }

    /**
     * 定义JmsMessagingTemplate
     *
     * @param connectionFactory
     * @return
     */
    @Bean(name = "xxJmsTemplate")
    public JmsMessagingTemplate getXxJmsTemplate(
            @Qualifier("xxPoolConnectionFactory") ConnectionFactory connectionFactory) {
        JmsMessagingTemplate template = new JmsMessagingTemplate(connectionFactory);
        return template;
    }

    /**
     * queue模式的ListenerContainer
     *
     * @param connectionFactory
     * @return
     */
    @Bean(name = "xxQueueListener")
    public DefaultJmsListenerContainerFactory getXxQueueListener(
            @Qualifier("xxPoolConnectionFactory") ConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setConcurrency("15");
        // change acknowledge mode
        // factory.setSessionAcknowledgeMode(4);
        return factory;
    }

    /**
     * topic模式的ListenerContainer
     *
     * @param connectionFactory
     * @return
     */
    @Bean(name = "xxTopicListener")
    public DefaultJmsListenerContainerFactory getXxTopicListener(
            @Qualifier("xxPoolConnectionFactory") ConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        // if topic, set true
        factory.setPubSubDomain(true);
        factory.setConcurrency("15");
        // change acknowledge mode
        // factory.setSessionAcknowledgeMode(4);
        return factory;
    }
}
@Component
@Slf4j
public class QueueSender {

    @Resource
    @Qualifier("xxJmsTemplate")
    JmsMessagingTemplate jmsTemplate;

    /**
     * 操作xxxxx数据
     */
    @Resource
    private Queue xxxxxJdptMailData;

    public void pushXxxxDataQueue(final String message) {
        this.jmsTemplate.convertAndSend(xxxxxData, message);
    }
}
public class DataXxxServiceImpl implements DataXxxService {

    private final DataXxxMapper dataXxxMapper;
    private final QueueSender queueSender;
   
    //Xxxxx为实体对象,这里只是举个栗子
    @Override
    @Async("xxxAsyncServiceExecutor")
    public Future<Boolean> dataHandle(Xxxxx xxx){
        queueSender.pushXxxxDataQueue(JSONUtil.toJsonStr(xxx));
        dataXxxMapper.updateStat(xxx);
        return new AsyncResult<>(true);
    }
}
@Component
@AllArgsConstructor
@Slf4j
public class ActiveMqXxxQueueReceiver {

    private final IXxxxService xxxxService;

    /**
     * 接收xxxx数据
     *
     * @param message
     */
    @JmsListener(destination = "xxxxxData", containerFactory = "xxQueueListener")
    public void receiveXxxxxDataQueue(String message) {
        log.info("接收xxxxx数据:{}", message);
        try {
            xxxxService.receiveXxxxlDataQueue(message);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("接收xxxxDataQueue数据列数据失败:{}", message);
        }
    }
}
//接收转化处理    
@Override
    @Transactional(rollbackFor = Exception.class)
    public void receiveXxxxDataQueue(String message) {
        //hutool工具转化
        Xxxx x= JSONUtil.toBean(message, Xxxx.class);
        //Map returnedMap = _GsonUtils.json2Obj(message);
        //。。。。。
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值