ActiveMQ的基本使用

介绍

ActiveMQ是基于Java开发的。比较成熟的消息中间件,适于初学者。

1.安装activemq

1.1 拉取镜像

docker pull webcenter/activemq:latest

1.2 运行容器

docker run \
    --name activemq \
    -d -p 8161:8161 -p 61616:61616 \
    -e ACTIVEMQ_ADMIN_LOGIN=admin \
    -e ACTIVEMQ_ADMIN_PASSWORD=1234 \
    -v $PWD/data:/data/activemq \
    -v $PWD/log:/var/log/activemq \
    webcenter/activemq:latest

1.3 web端口是8161

正常应该可以访问到:

2.连接工厂方式

2.1 发布者

public class myActiveMQPublisher {
    private static final String ACTIVEMQ_URL = "tcp://192.168.32.128:61616";
    private static final String USERNAME = "kingah";
    private static final String PASSWORD = "1234";
    private static final String QUEUE_NAME = "xxxx";

    public static void main(String[] args) throws Exception {
        // 1.创建连接工厂
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, ACTIVEMQ_URL);
        // 2.创建连接
        Connection conn = factory.createConnection();
        conn.start();
        // 3.创建会话
        // 事务、签收
        Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 4.创建目的地(子接口为topic、queue)
        Queue destination = session.createQueue(QUEUE_NAME);
        // 5.创建消息的生产者
        MessageProducer producer = session.createProducer(destination);
        // 6.创建消息
        TextMessage message = session.createTextMessage("消息....");
        // 7.生产者发送消息
        producer.send(message);

        // 8.关闭资源
        producer.close();
        session.close();
        conn.close();
        System.out.println("消息发布完成...");
    }
}

2.2 消费者

    private static final String ACTIVEMQ_URL = "tcp://192.168.32.128:61616";
    private static final String USERNAME = "kingah";
    private static final String PASSWORD = "1234";
    private static final String QUEUE_NAME = "xxxx";

    public static void main(String[] args) throws Exception {
        // 1.创建连接工厂
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, ACTIVEMQ_URL);
        // 2.创建连接
        Connection conn = factory.createConnection();
        conn.start();
        // 3.创建会话
        // 事务、签收
        Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 4.创建目的地(子接口为topic、queue)
        Queue destination = session.createQueue(QUEUE_NAME);
        // 5.创建消息的生产者
        MessageConsumer consumer = session.createConsumer(destination);
        // 实时监听
        while (true) {
            // receive(参数),不加参数是阻塞,加参数是过时不候。
            TextMessage message = (TextMessage) consumer.receive();
            if (message != null) {
                System.out.println("****消费者接收到消息****:" + message.getText());
            } else {
                break;
            }
        }

        // 8.关闭资源
        consumer.close();
        session.close();
        conn.close();
        System.out.println("消息发布完成...");
    }
    
    // 异步非阻塞,可以替换第7步
    public static void listener(MessageConsumer consumer) throws JMSException, IOException {
        consumer.setMessageListener((Message message) -> {
            if (message != null && message instanceof TextMessage) {
                TextMessage msg = (TextMessage) message;
                try {
                    System.out.println("****消费者接收到消息****:" + msg.getText());
                } catch (JMSException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        
        // 这一步不要忘记
        System.in.read();
    }
}

3.springboot整合activemq

3.1 编写配置文件application.yml

spring:
  activemq:
    broker-url: tcp://192.168.32.128:61616
    user: kingah
    password: 1234
  jms:
    template:
      default-destination: kingah # 默认目的地

3.2 编写发布者逻辑

    @GetMapping("/active/send")
    public Result sendMessage2(String message, String sender, @RequestParam(required = true) String receiver) throws JsonProcessingException {
        // 构建物流信息
        LogisticsMessage logisticsMessage = LogisticsMessage.builder()
                .sendTime(LocalDateTime.now())
                .destination(receiver)
                .description(message)
                .sender(sender)
                .receiver(receiver)
                .build();

        // 注册时间模块
        ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule());
        String jsonMessage = objectMapper.writeValueAsString(logisticsMessage);


        jmsMessagingTemplate.convertAndSend(receiver, jsonMessage);
        return Result.success("成功");
    }

3.3 编写Jms监听器

@Component
@Slf4j
public class ActiveMQListener {
    @JmsListener(destination = "queueName")
    public void receive(String msg) {
        log.info("接收到消息:{}", msg);
    }
}

4.topic和queue的区别

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值