springboot整合activemq实现传递对象简单例子

文章目录

  • 导入activemq依赖

  • 配置activemq.yml配置

  • activemq简单示例

一、导入activemq依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-activemq</artifactId>
    <version>5.14.5</version>
</dependency>
<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>activemq-pool</artifactId>
  <version>5.14.5</version>
</dependency>
<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>activemq-spring</artifactId>
  <version>5.14.5</version>
</dependency>
<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>artemis-jms-client</artifactId>
  <version>2.3.0</version>
</dependency>

千万不要这样引入

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-all</artifactId>
    <version>5.15.8</version>
</dependency>

二、配置yml配置

server:
  port: 8080

spring:
  activemq:
    broker-url: tcp://127.0.0.1:61616
    user: admin
    password: admin
    packages:
    trust-all: true #配置白名单,可能会失效,不行就在接收方配置

三、简单例子-PTP

1.调用接口对消息做处理

Product文件

@Component
public class ProducerImpl implements Producer {
    @Autowired
    JmsMessagingTemplate jmsMessagingTemplate;

    /**
     *
     * @param destinationName 目的地
     * @param message   发送消息的内容
     */
    @Override
    public void sendMsg(String destinationName, Users message) {
        //创建连接工厂
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://localhost:61616");
        MessageProducer producer = null;
        Session session = null;
        Connection connection = null;
        try {
            //创建连接
            connection = connectionFactory.createConnection();
            //开启连接
            connection.start();
            //创建一个session对象
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            Queue queue = session.createQueue(destinationName);
            //创建一个序列化消息
            ObjectMessage objectMessage = session.createObjectMessage(message);
            producer = session.createProducer(queue);
            producer.send(objectMessage);
        } catch (JMSException e) {
            e.printStackTrace();
        }finally {
            //关闭连接
            try {
                producer.close();
                session.close();
                connection.close();
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}

 Consumer文件

package com.goodmap.gxun.service.activemq.impl;

import com.goodmap.gxun.pojo.Users;
import com.goodmap.gxun.service.activemq.Consumer;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQObjectMessage;
import org.springframework.stereotype.Component;

import javax.jms.*;


@Component
public class ConsumerImpl implements Consumer {
    // ConnectionFactory :连接工厂,JMS 用它创建连接
    ConnectionFactory connectionFactory;
    // Connection :JMS 客户端到JMS Provider 的连接
    Connection connection = null;
    // Session: 一个发送或接收消息的线程
    Session session = null;
    // Destination :消息的目的地;消息发送给谁.
    Destination destination;
    // 消费者,消息接收者
    MessageConsumer consumer = null;
    //消费者,接受对象
    ActiveMQObjectMessage msg = null;;
//    @JmsListener(destination = "test.queue")//使用JMSListener 监听Producer的消息
    @Override
    public String reveived(String queueName) {
        connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://localhost:61616");
//        配置activemq白名单
        ((ActiveMQConnectionFactory) connectionFactory).setTrustAllPackages(true);
        try {
            connection = connectionFactory.createConnection();
            connection.start();
            /**
             * param1 boolean 是否支持事务
             * param2 1、Session.AUTO_ACKNOWLEDGE:为自动确认,客户端发送和接收消息不需要做额                    外的工作。
             *
             * 2、Session.CLIENT_ACKNOWLEDGE:为客户端确认。客户端接收到消息后,必须调用javax.jms.Message的acknowledge方法。jms服务器才会删除消息。
             *
             * 3、DUPS_OK_ACKNOWLEDGE:允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。在需要考虑资源使用时,这种模式非常有效。
             *
             * 4、SESSION_TRANSACTED
             */
            session = connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);
            destination = session.createQueue(queueName);
            consumer = session.createConsumer(destination);
            System.out.println("开始");
            while (true) {
                // 设置接收者接收消息的时间,为了便于测试,这里谁定为100s
                msg = (ActiveMQObjectMessage) consumer.receive(5000);
                if (null != msg) {
                Users users1 = (Users) msg.getObject();
                System.out.println("收到消息" + users1);
                }else break;
            }
            System.out.println("结束");
        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != connection) {
                    connection.close();
                }
                if (session != null) {
                    session.close();
                }
                if (consumer != null) {
                    consumer.close();
                }

            } catch (Throwable ignore) {
            }
        }
        return "";

    }
}

 Controller文件

package com.goodmap.gxun.controller;

import com.goodmap.gxun.pojo.Users;
import com.goodmap.gxun.service.activemq.Consumer;
import com.goodmap.gxun.service.activemq.Producer;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
@Api(tags = "消息队列")
@RequestMapping("activemq")
public class ActivemqController {
    @Autowired
    Producer producer;
    @Autowired
    Consumer consumer;
    @GetMapping("/send")
    @ApiOperation("发送消息队列")
    public void sendMessage(){
        Users users = new Users();
        users.setName("王老板");
        users.setPassword("123");
        System.out.println(users);
        producer.sendMsg("test.queue",users);
    }
    @GetMapping("/recevice")
    @ApiOperation("接受消息队列")
    public String receviceMessage(){
        String  me = consumer.reveived("test.queue");
        return "";
    }
}

 我用的swagger测试的

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值