SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用

1. activemq

  首先引入依赖

  pom.xml文件

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

  创建一个配置队列类

  JMSConfiguration.java

package com.wangx.boot.util;

import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;

import javax.jms.Destination;

@Configuration
@EnableJms
public class JMSConfiguration {

    @Bean
    public Destination createDestination () {
        return new ActiveMQQueue("com.wangx");
    }
}

  创建一个消息生产者和消息消费者

  

package com.wangx.boot.mq;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;

import javax.jms.Destination;
@Component
public class JMSComponent {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    @Autowired
    private Destination destination;

    public void send (String message) {
        jmsMessagingTemplate.convertAndSend(destination, message);
    }

    @JmsListener(destination = "com.wangx")
    public void listener (String message) {
        System.out.println("接收到的消息:" + message);
    }
}

  @JmsListener中的destination必须与队列配置类中定一的queue的名字相同。

   SpringBoot提供了一个默认内置的消息队列中间件,如果我们使用spring.activemq.in-memory=true时将会使用内置的消息队列,但是它也提供了我们使用外部activemq的一些配置:

  

#spring.activemq.broker-url=
#spring.activemq.password=
#spring.activemq.user=
#spring.activemq.packages.trust-all=false
#spring.activemq.packages.trusted=
#spring.activemq.pool.configuration.*=
#spring.activemq.pool.enabled=false
#spring.activemq.pool.expiry-timeout=0
#spring.activemq.pool.idle-timeout=30000
#spring.activemq.pool.max-connections=1

  测试消息发送

  

package com.wangx.boot.controller;

import com.wangx.boot.mq.JMSComponent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/mq")
public class JMSController {

    @Autowired
    private JMSComponent jmsComponent;

    @RequestMapping("/send")
    @ResponseBody
    public String send(String msg) {
        jmsComponent.send(msg);
        return msg;
    }
}

  当访问localhost:8080/mq/send?msg=xxx时,消费者的监听方法(带有@JmsListener注解的方法)会自动监听到消息,并打印到控制台上。

2. rabbitmq的使用

  首先引入pom.xml 

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

ps:rabbitmq和activemq的依赖不能同时存在。

  首先还是创建一个队列配置类

  AMQConfiguration.java

package com.wangx.boot.util;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AMQConfiguration {

    @Bean
    public Queue queue() {
        return new Queue("hello", true);
    }

}

  接着创建消息生产和消费组件

package com.wangx.boot.mq;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class AMQComponent {

    @Autowired
    private AmqpTemplate amqpTemplate;

    public void send(String message) {
        amqpTemplate.convertAndSend("hello", message);
    }

    @RabbitListener(queues = "hello")
    public void receiveQueue(String text) {
        System.out.println("接受到:" + text);
    }
}

  在SpringBoot的启动类上添加@EnableRabbit表示开启rabbit消息队列。

  测试是否发送了消息

  

package com.wangx.boot.controller;

import com.wangx.boot.mq.AMQComponent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/amq")
public class AMQController {

    @Autowired
    private AMQComponent amqComponent;

    @RequestMapping("/send")
    @ResponseBody
    public String send(String  msg) {
        amqComponent.send(msg);
        return msg;
    }
}

  访问localhost:8080/amq/send?msg=xxx,在调用放松消息的方法时。监听的方法同样会收到消息,并打印到控制台上。

3. 调用rest服务

  3.1 代码实现

    首先引入依赖

    pom文件

<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
</dependency>

  然后随便写一个Controller接口,如:

package com.wangx.boot.controller;

import com.wangx.boot.cache.CachingBook;
import com.wangx.boot.entity.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class ApiController {

    @Autowired
    private CachingBook cachingBook;

    @RequestMapping(value = "/select", method = RequestMethod.GET)
    public Book get(@RequestParam(defaultValue = "遮天") String name) {
        Book book = cachingBook.findById(name);
        return book;
    }

    @RequestMapping(value = "/update", method = RequestMethod.GET)
    public Book update(@RequestParam(defaultValue = "遮天") String name) {
        Book bean = cachingBook.findById(name);
        bean.setAuthor("耳根");
        cachingBook.updateById(bean);
        return bean;
    }

    @RequestMapping(value = "/del", method = RequestMethod.GET)
    public String del(@RequestParam(defaultValue = "遮天") String name) {
        return cachingBook.deleteById(name);
    }
}

  启动服务,在另一个工程中使用RestTemplateBuilder来访问我们启动的服务,

@Autowired
    private RestTemplateBuilder restTemplateBuilder;

        /**
         * get请求
         */
        @Test
        public void getForObject() {
            //发送get请求
            String res = restTemplateBuilder.build().getForObject("http://localhost:8080/api/select",String.class, "遮天");
            System.out.println(res);
            Map<String,Object> map = new HashMap<String,Object>();
            map.put("name", "遮天");
            //发送post请求
            res = restTemplateBuilder.build().postForObject("http://localhost:8080/api/update", map, String.class);
            System.out.println(res);
        }

  可以成功调用我们启动的服务的接口。

  3.2 使用代理

    使用RestTemplate还可以自己实现代理的功能。

  

public class ProxyCustomizer implements RestTemplateCustomizer {
        @Override
        public void customize(RestTemplate restTemplate) {
                        //http://ip.zdaye.com/ 上可以查询可用的主机和端口
            String proxyHost = "59.33.46.187";
            int proxyPort = 6969;

            HttpHost proxy = new HttpHost(proxyHost, proxyPort);
            HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {
                @Override
                public HttpHost determineProxy(HttpHost target, HttpRequest request, HttpContext context) throws HttpException {

                    return super.determineProxy(target, request, context);
                }
            }).build();
            HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
            httpComponentsClientHttpRequestFactory.setConnectTimeout(10000);
            httpComponentsClientHttpRequestFactory.setReadTimeout(60000);
            restTemplate.setRequestFactory(httpComponentsClientHttpRequestFactory);
        }
    }

  测试方式:

String result = restTemplateBuilder.additionalCustomizers(new ProxyCustomizer()).build().getForObject("http://www.baidu.com", String.class);
        System.out.println(result);

原文地址:https://www.cnblogs.com/leeego-123/p/10900245.html

时间: 2024-10-06 21:41:36

SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用的相关文章

RabbitMQ (消息队列)专题学习07 RPC

(使用Java客户端) 一.概述 在Work Queue的章节中我们学习了如何使用Work Queue分配耗时的任务给多个工作者,但是如果我们需要运行一个函数在远程计算机上,这是一个完全不同的情景,这种模式通常被称之为RPC. 在本章节的学习中,我们将使用RabbitMQ来构建一个RPC系统:一个远程客户端和一个可扩展的RPC服务器,我们没有任何费时的任务进行分配,我们将创建一个虚拟的RPC服务返回Fibonacci数. 1.1.客户端接口(Client Interface) 为了说明一个RPC

RabbitMQ (消息队列)专题学习06 Topic

(使用Java客户端) 一.概述 在路由消息分发的学习中,对日志记录系统做了改进,使用direct exchange来替换fanout exchange进行消息分发,可以使日志系统有了直接.并且可以有选择的接收消息. 尽管使用direct exchange改进了系统,但是它仍然有局限性,就是不能根据多个标准来分发消息. 在日志系统中,我们也许想订阅的不仅仅是基于日志消息的严重程度,而且可能是基于日志消息的发送源. 这将给我们带来很多的灵活,我可能想坚挺的错误来自"cron"的消息源,而

JAVA的设计模式之观察者模式----结合ActiveMQ消息队列说明

1----------------------观察者模式------------------------------ 观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新. activeMQ消息队列 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮

RabbitMQ (消息队列)专题学习05 routing(路由)

(使用Java客户端) 一.概述 在前面的学习中,构建了一个简单的日志记录系统,能够广播所有的日志给多个接收者,在该部分学习中,将添加一个新的特点,就是可以只订阅一个特定的消息源,也就是说能够直接把关键的错误日志消息发送到日志文件保存起来,不重要的日志信息文件不保存在磁盘中,但是仍然能够在控制台输出,那么这便是我们这部分要学习的消息的路由分发机制. 二.路由功能实现 2.1.绑定(bindings) 在前面的学习中已经创建了绑定(bindings),代码如下: channel.queueBind

RabbitMQ (消息队列)专题学习03 Work Queues(工作队列)

一.概述 工作队列(Work queues) (使用Java客户端) 在前面的专题学习中,我们使用Java语言实现了一个简单的从名为"hello"的队列中发送和接收消息的程序,在这部内容中我们将创建一个工作队列被用来分配定时消息任务,而且通过多个接收者(工作者)实现. 工作队列(又名任务队列),主要的思想是为了避免立即做一个资源密集型的任务(多消息同时密集发送),不必等待它完成,当运行许多工作者的让任务都在她们之间共享. 它在web应用中是非常有用的,因为在很短的时间内http请求窗口

RabbitMQ (消息队列)专题学习02 Hello World

一.概述 RabbitMQ可以当做一个消息代理,它的核心原理非常简单:即接收和发送消息,可以把它想象成一个邮局:我们把信件放入邮箱,邮递员就会把信件投递到你的收件人处,RabbitMQ就是一个邮箱.邮局.投递员功能综合体,整个过程就是:邮箱接收信件,邮局转发信件,投递员投递信件到达收件人处. RabbitMQ和邮局的主要区别就是RabbitMQ接收.存储和发送的是二进制数据----消息. 在专题学习一中我们已经简单提到了一些概念,在此我们更为深入的学习下RabbitMQ相关的专有名词. 1.生产

RabbitMQ (消息队列)专题学习01 RabbitMQ部署

一.概述 RabbitMQ(Message Queue)是当前流行的开源的消息队列系统,用ERLang语言开发,按照AMQP(Advanced Message Queue Protocol)的标准实现,消息队列是一种应用程序对应用程序之间的通信方法,应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,则无需专用链接来链接它们,RabbitMQ便是这样一种用于应用程序之间通信的中间件. 二.架构 RabbitMQ的架构图如下: 图-1 在此有几个概念需要说明一下: 1.Exchange:消

C#调用RabbitMQ实现消息队列

我在刚接触使用中间件的时候,发现,中间件的使用并不是最难的,反而是中间件的下载,安装,配置才是最难的. 所以,这篇文章我们从头开始学习RabbitMq,真正的从头开始. 关于消息队列 其实消息队列没有那么神秘,我们这样想一下,用户访问网站,最终是要将数据以HTTP的协议的方式,通过网络传输到主机的某个端口上的. 那么,接收数据的方式是什么呢?自然是端口监听啦. 那消息队列是什么就很好解释了? 它就是端口监听,接到数据后,将数据排列起来. 那这件事,我们不用中间件能做吗? 当然能做啦,写个TCP/

RabbitMQ分布式消息队列服务器(一、Windows下安装和部署)

RabbitMQ消息队列服务器在Windows下的安装和部署-> 一.Erlang语言环境的搭建 RabbitMQ开源消息队列服务是使用Erlang语言开发的,因此我们要使用他就必须先进行Erlang语言环境的搭建,其实是非常简单的. 登录Erlang官网,进入下载页,官网地址->http://www.erlang.org/downloads 然后按照自己的系统环境来选择需要下载的安装文件. 我选择 64-bit下载包,因为我的操作系统是64位的 接下来我们需要对Erlang语言的环境变量的配