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);