热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot学习笔记(11)SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用

首先引入依赖pom.xml文件<dependency><groupId&a

  首先引入依赖

  pom.xml文件

<dependency>
     <groupId>org.springframework.bootgroupId>
     <artifactId>spring-boot-starter-activemqartifactId>
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 


            org.springframework.boot
            spring-boot-starter-amqp
        

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文件


            org.apache.httpcomponents
            httpclient

  然后随便写一个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 map = new HashMap();
            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);
 

原文 SpringBoot学习笔记(11)-----SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用

  首先引入依赖

  pom.xml文件

<dependency>
     <groupId>org.springframework.bootgroupId>
     <artifactId>spring-boot-starter-activemqartifactId>
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 


            org.springframework.boot
            spring-boot-starter-amqp
        

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文件


            org.apache.httpcomponents
            httpclient

  然后随便写一个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 map = new HashMap();
            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);

推荐阅读
  • 烤鸭|本文_Spring之Bean的生命周期详解
    烤鸭|本文_Spring之Bean的生命周期详解 ... [详细]
  • Logback使用小结
    1一定要使用slf4j的jar包,不要使用apachecommons的jar。否则滚动生成文件不生效,不滚动的时候却生效~~importorg.slf ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 深入解析Spring Boot自动配置机制
    本文旨在深入探讨Spring Boot的自动配置机制,特别是如何利用配置文件进行有效的设置。通过实例分析,如Http编码自动配置,我们将揭示配置项的具体作用及其背后的实现逻辑。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • Spring Boot单元测试中Redis连接失败的解决方案
    本文探讨了在Spring Boot项目中进行单元测试时遇到Redis连接问题的原因及解决方法,详细分析了配置文件加载路径不当导致的问题,并提供了有效的解决方案。 ... [详细]
  • 基于机器学习的人脸识别系统实现
    本文介绍了一种使用机器学习技术构建人脸识别系统的实践案例。通过结合Python编程语言和深度学习框架,详细展示了从数据预处理到模型训练的完整流程,并提供了代码示例。 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
author-avatar
宝宝贝贝侠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有