SpringBoot学习笔记(11)-----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);
posted @ 2018-10-18 17:42  Eternally_dream  阅读(630)  评论(0编辑  收藏  举报