目录:

交换机

RabbitMQ整合SpringCloud

交换机属性:

Name:交换机名称
Type:交换机类型 direct、topic、fanout、headers
Durability:是否需要持久化,true为持久化
Auto Delete:当最后一个绑定到Exchange上的队列删除后,自动删除该Exchange
Internal:当前Exchange是否用于RabbitMQ内部使用,默认为False
Arguments:扩展参数,用于扩展AMQP协议,定制化使用

直流交换机

直连交换机Direct Exchange(完全匹配路由key)
所有发送到Direct Exchange的消息会被转发到RouteKey中指定的Queue
注意:Direct模式可以使用RabbitMQ自带的Exchange:default Exchange,所以不需要将Exchange进行任何绑定(binding)操作,消息传递时,RouteKey必须完全匹配才会被队列接收,否则该消息会被抛弃;


消费端代码

package com.liuxia.rabbitmqapi.exchange.direct;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;public class Consumer4DirectExchange {public static void main(String[] args) throws Exception {ConnectionFactory connectionFactory = new ConnectionFactory() ;connectionFactory.setHost("192.168.137.129");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");connectionFactory.setAutomaticRecoveryEnabled(true);connectionFactory.setNetworkRecoveryInterval(3000);Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//4 声明String exchangeName = "test_direct_exchange";String exchangeType = "direct";String queueName = "test_direct_queue";String routingKey = "test.direct";//表示声明了一个交换机channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);//表示声明了一个队列channel.queueDeclare(queueName, false, false, false, null);//建立一个绑定关系:channel.queueBind(queueName, exchangeName, routingKey);//durable 是否持久化消息QueueingConsumer consumer = new QueueingConsumer(channel);//参数:队列名称、是否自动ACK、Consumerchannel.basicConsume(queueName, true, consumer);//循环获取消息while(true){//获取消息,如果没有消息,这一步将会一直阻塞QueueingConsumer.Delivery delivery = consumer.nextDelivery();String msg = new String(delivery.getBody());System.out.println("收到消息:" + msg);}}
}

生产端代码

package com.liuxia.rabbitmqapi.exchange.direct;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Producer4DirectExchange {public static void main(String[] args) throws Exception {//1 创建ConnectionFactoryConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("192.168.137.129");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");//2 创建ConnectionConnection connection = connectionFactory.newConnection();//3 创建ChannelChannel channel = connection.createChannel();//4 声明String exchangeName = "test_direct_exchange";String routingKey = "test.direct";
//        String routingKey = "test.direct111"; //收不到//5 发送String msg = "Hello World RabbitMQ 4  Direct Exchange Message 111 ... ";channel.basicPublish(exchangeName, routingKey , null , msg.getBytes());}
}

主题交换机

主题交换机Topic Exchange(匹配路由规则的交换机)
所有发送到Topic Exchange的消息被转发到所有关系RouteKey中指定Topic的Queue上;
Exchange将RouteKey和某Topic进行模糊匹配,此时队列需要绑定一个Topic;
注意:可以使用通配符进行模糊匹配
符号:“#” 匹配一个或者多个词
符号:“” 匹配不多不少一个词
列如:
“log.#” 能够匹配到 “log.info.oa”
“log.
” 能够匹配到 “log.err”


消费端代码

package com.liuxia.rabbitmqapi.exchange.topic;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;public class Consumer4TopicExchange {public static void main(String[] args) throws Exception {ConnectionFactory connectionFactory = new ConnectionFactory() ;connectionFactory.setHost("192.168.137.129");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");connectionFactory.setAutomaticRecoveryEnabled(true);connectionFactory.setNetworkRecoveryInterval(3000);Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//4 声明String exchangeName = "test_topic_exchange";String exchangeType = "topic";String queueName = "test_topic_queue";String routingKey = "user.#";
//        String routingKey = "user.*";// 1 声明交换机channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);// 2 声明队列channel.queueDeclare(queueName, false, false, false, null);// 3 建立交换机和队列的绑定关系:channel.queueBind(queueName, exchangeName, routingKey);//durable 是否持久化消息QueueingConsumer consumer = new QueueingConsumer(channel);//参数:队列名称、是否自动ACK、Consumerchannel.basicConsume(queueName, true, consumer);//循环获取消息while(true){//获取消息,如果没有消息,这一步将会一直阻塞QueueingConsumer.Delivery delivery = consumer.nextDelivery();String msg = new String(delivery.getBody());System.out.println("收到消息:" + msg);}}
}

生产端代码

package com.liuxia.rabbitmqapi.exchange.topic;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Producer4TopicExchange {public static void main(String[] args) throws Exception {//1 创建ConnectionFactoryConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("192.168.137.129");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");//2 创建ConnectionConnection connection = connectionFactory.newConnection();//3 创建ChannelChannel channel = connection.createChannel();//4 声明String exchangeName = "test_topic_exchange";String routingKey1 = "user.save";String routingKey2 = "user.update";String routingKey3 = "user.delete.abc";//5 发送String msg = "Hello World RabbitMQ 4 Topic Exchange Message ...";channel.basicPublish(exchangeName, routingKey1 , null , msg.getBytes());channel.basicPublish(exchangeName, routingKey2 , null , msg.getBytes());channel.basicPublish(exchangeName, routingKey3 , null , msg.getBytes());channel.close();connection.close();}
}

输出交换机

输出交换机Fanout Exchange(不做路由)
不处理路由键,只需要简单的将队列绑定到交换机上;
发送到交换机的消息都会被转发到与该交换机绑定的所有队列上;
Fanout交换机转发消息是最快的


消费端代码

package com.liuxia.rabbitmqapi.exchange.fanout;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;public class Consumer4FanoutExchange {public static void main(String[] args) throws Exception {ConnectionFactory connectionFactory = new ConnectionFactory() ;connectionFactory.setHost("192.168.137.129");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");connectionFactory.setAutomaticRecoveryEnabled(true);connectionFactory.setNetworkRecoveryInterval(3000);Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//4 声明String exchangeName = "test_fanout_exchange";String exchangeType = "fanout";String queueName = "test_fanout_queue";String routingKey = "";    //不设置路由键channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);channel.queueDeclare(queueName, false, false, false, null);channel.queueBind(queueName, exchangeName, routingKey);//durable 是否持久化消息QueueingConsumer consumer = new QueueingConsumer(channel);//参数:队列名称、是否自动ACK、Consumerchannel.basicConsume(queueName, true, consumer);//循环获取消息while(true){//获取消息,如果没有消息,这一步将会一直阻塞QueueingConsumer.Delivery delivery = consumer.nextDelivery();String msg = new String(delivery.getBody());System.out.println("收到消息:" + msg);}}
}

生产端代码

package com.liuxia.rabbitmqapi.exchange.fanout;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Producer4FanoutExchange {public static void main(String[] args) throws Exception {//1 创建ConnectionFactoryConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("192.168.137.129");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");//2 创建ConnectionConnection connection = connectionFactory.newConnection();//3 创建ChannelChannel channel = connection.createChannel();//4 声明String exchangeName = "test_fanout_exchange";//5 发送for(int i = 0; i < 10; i ++) {String msg = "Hello World RabbitMQ 4 FANOUT Exchange Message ...";channel.basicPublish(exchangeName, "", null , msg.getBytes());}channel.close();connection.close();}
}

RabbitMQ整合SpringCloud

最终我们的消息中间件是要运用到项目中去的,就拿下完订单之后要发送短信这个来距离,我们最终的目的就是要实现下订单和发短信的异步处理,短信的发送成功与否不影响订单的运行
我们今天最终整合完的流程就是这样的,只不过今天只是一个简单案例,没有搭建eureka


rabbitmq-common、rabbitmq-springcloud-consumer、rabbitmq-springcloud-producer
今天我们在父工程下需要新建的3个项目

rabbitmq-common主要就是存放公共代码,今天这里只有一个实体类

Order

package com.liuxia.rabbitmqcommon.entity;import java.io.Serializable;public class Order implements Serializable {private String id;private String name;public Order() {}public Order(String id, String name) {super();this.id = id;this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

rabbitmq-springcloud-consumer模拟我们的消费者,消费信息
pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.liuxia</groupId><artifactId>rabbitmq-springcloud-consumer</artifactId><version>0.0.1-SNAPSHOT</version><name>rabbitmq-springcloud-consumer</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>com.liuxia</groupId><artifactId>rabbitmq-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

接收信息业务代码RabbitReceiver,我们ACK设置手动接收
这里我们实例化队列有两种做法,
@RabbitListener主要就是依靠这个注解
1、我们可以把queue的信息放在application.properties中,然后我们再把信息读取出来
2、我们直接把信息写在注解里面

package com.liuxia.rabbitmqspringcloudconsumer.consumer;import com.liuxia.rabbitmqcommon.entity.Order;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.Message;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;import java.util.Map;@Component
public class RabbitReceiver {@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "queue-1", durable="true"),exchange = @Exchange(value = "exchange-1", durable="true", type= "topic", ignoreDeclarationExceptions = "true"),key = "springboot.*"))@RabbitHandlerpublic void onMessage(Message message, Channel channel) throws Exception {System.err.println("--------------------------------------");System.err.println("消费端Payload: " + message.getPayload());Long deliveryTag = (Long)message.getHeaders().get(AmqpHeaders.DELIVERY_TAG);//手工ACKchannel.basicAck(deliveryTag, false);}/*** *     spring.rabbitmq.listener.order.queue.name=queue-2spring.rabbitmq.listener.order.queue.durable=truespring.rabbitmq.listener.order.exchange.name=exchange-1spring.rabbitmq.listener.order.exchange.durable=truespring.rabbitmq.listener.order.exchange.type=topicspring.rabbitmq.listener.order.exchange.ignoreDeclarationExceptions=truespring.rabbitmq.listener.order.key=springboot.** @param order* @param channel* @param headers* @throws Exception*/@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "${spring.rabbitmq.listener.order.queue.name}", durable="${spring.rabbitmq.listener.order.queue.durable}"),exchange = @Exchange(value = "${spring.rabbitmq.listener.order.exchange.name}", durable="${spring.rabbitmq.listener.order.exchange.durable}", type= "${spring.rabbitmq.listener.order.exchange.type}", ignoreDeclarationExceptions = "${spring.rabbitmq.listener.order.exchange.ignoreDeclarationExceptions}"),key = "${spring.rabbitmq.listener.order.key}"))@RabbitHandlerpublic void onOrderMessage(@Payload Order order,Channel channel, @Headers Map<String, Object> headers) throws Exception {System.err.println("--------------------------------------");System.err.println("消费端order: " + order.getId());Long deliveryTag = (Long)headers.get(AmqpHeaders.DELIVERY_TAG);//手工ACKchannel.basicAck(deliveryTag, false);}
}

application.properties,这里面放置了我们交换机、队列的一些具体信息

spring.rabbitmq.addresses=192.168.137.129:5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000spring.rabbitmq.listener.simple.acknowledge-mode=manual
spring.rabbitmq.listener.simple.concurrency=5
spring.rabbitmq.listener.simple.max-concurrency=10spring.rabbitmq.listener.order.queue.name=queue-2
spring.rabbitmq.listener.order.queue.durable=true
spring.rabbitmq.listener.order.exchange.name=exchange-2
spring.rabbitmq.listener.order.exchange.durable=true
spring.rabbitmq.listener.order.exchange.type=topic
spring.rabbitmq.listener.order.exchange.ignoreDeclarationExceptions=true
spring.rabbitmq.listener.order.key=springboot.*

rabbitmq-springcloud-producer模拟我们生产者,发送信息
pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.liuxia</groupId><artifactId>rabbitmq-springcloud-producer</artifactId><version>0.0.1-SNAPSHOT</version><name>rabbitmq-springcloud-producer</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>com.liuxia</groupId><artifactId>rabbitmq-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.2.1.RELEASE</version><scope>compile</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

application.properties连接我们docker的rabbitmq

spring.rabbitmq.addresses=192.168.137.129:5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true
spring.rabbitmq.template.mandatory=true

生成具体消息业务代码producer,以及我们的Confirm和Return都在这个里面

package com.liuxia.rabbitmqspringcloudproducer.producer;import com.liuxia.rabbitmqcommon.entity.Order;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ReturnCallback;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;import java.util.Map;@Component
public class RabbitSender {//自动注入RabbitTemplate模板类@Autowiredprivate RabbitTemplate rabbitTemplate;  //回调函数: confirm确认final ConfirmCallback confirmCallback = new ConfirmCallback() {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {System.err.println("correlationData: " + correlationData);System.err.println("ack: " + ack);if(!ack){System.err.println("异常处理....");}}};//回调函数: return返回final ReturnCallback returnCallback = new ReturnCallback() {@Overridepublic void returnedMessage(org.springframework.amqp.core.Message message, int replyCode, String replyText,String exchange, String routingKey) {System.err.println("return exchange: " + exchange + ", routingKey: " + routingKey + ", replyCode: " + replyCode + ", replyText: " + replyText);}};//发送消息方法调用: 构建Message消息public void send(Object message, Map<String, Object> properties) throws Exception {MessageHeaders mhs = new MessageHeaders(properties);Message msg = MessageBuilder.createMessage(message, mhs);rabbitTemplate.setConfirmCallback(confirmCallback);rabbitTemplate.setReturnCallback(returnCallback);//id + 时间戳 全局唯一 CorrelationData correlationData = new CorrelationData("1234567890");rabbitTemplate.convertAndSend("exchange-1", "springboot.abc", msg, correlationData);}//发送消息方法调用: 构建自定义对象消息public void sendOrder(Order order) throws Exception {rabbitTemplate.setConfirmCallback(confirmCallback);rabbitTemplate.setReturnCallback(returnCallback);//id + 时间戳 全局唯一 CorrelationData correlationData = new CorrelationData("0987654321");rabbitTemplate.convertAndSend("exchange-2", "springboot.def", order, correlationData);}
}

我们的测试代码

package com.liuxia.rabbitmqspringcloudproducer;import com.liuxia.rabbitmqcommon.entity.Order;
import com.liuxia.rabbitmqspringcloudproducer.producer.RabbitSender;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitmqSpringcloudProducerApplicationTests {@Autowiredprivate RabbitSender rabbitSender;private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");@Testpublic void testSender1() throws Exception {Map<String, Object> properties = new HashMap<>();properties.put("number", "12345");properties.put("send_time", simpleDateFormat.format(new Date()));rabbitSender.send("Hello RabbitMQ For Spring Boot!", properties);}@Testpublic void testSender2() throws Exception {Order order = new Order("001", "第一个订单");rabbitSender.sendOrder(order);}}

end…

RabbitMQ整合SpringCloud相关推荐

  1. es springboot 不设置id_es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程详解

    注意:适用于springboot或者springcloud框架 1.首先下载相关文件 2.然后需要去启动相关的启动文件 3.导入相关jar包(如果有相关的依赖包不需要导入)以及配置配置文件,并且写一个 ...

  2. Dubbo(十五)springboot工程dubbo整合SpringCloud Hystrix

    本章将编写一个使用SpringBoot工程集成dubbo使用hystrix组件实现服务熔断示例.包含服务提供者工程和服务消费者工程.主要在实现整合springcloud hystrix过程步骤如下: ...

  3. Spring Cloud Stream与RabbitMQ整合

    Spring Cloud与RabbitMQ整合需要引入下述依赖 <dependency><groupId>org.springframework.cloud</group ...

  4. Nacos教程_3 整合SpringCloud(配置中心+服务发现)

    教程原稿 https://gitee.com/fakerlove/joker-nacos 文章目录 3. 整合SpringCloud(配置中心+服务发现) 3.1 写配置 3.2 创建父工程demo ...

  5. Seata整合SpringCloud

    Seata整合SpringCloud 业务场景 项目中业务系统与微服务之间需要同步更新数据库,遇到了分布式事务问题. 在两种场景下会出现数据不一致:第一,当微服务方法成功执行,业务系统遭遇异常时,业务 ...

  6. springboot+rabbitMq整合开发实战一

    springboot+rabbitMq整合开发实战一 消息队列mq相信诸位都听过,甚至还用的相当娴熟,我也是近来才接触,个人感觉相当不错,特别是在业务模块的开发中进行异步解耦有很大的作用.这篇博文主要 ...

  7. [RabbitMQ]整合SpringBoot

    整合SpringBoot 创建项目 引入依赖 <dependencies><!--RabbitMQ 依赖--><dependency><groupId> ...

  8. SpringBoot RabbitMQ 整合使用

    转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/01/26/SpringBoot-RabbitMQ/ 关注我 前提 上次写了篇文章,<SpringB ...

  9. 33、springboot整合springcloud

    Spring Cloud Spring Cloud是一个分布式的整体解决方案.Spring Cloud 为开发者提供了在分布式系统 (配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token ...

  10. springboot + rabbitmq 整合示例

    几个概念说明: Broker:简单来说就是消息队列服务器实体. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列. Queue:消息队列载体,每个消息都会被投入到一个或多个队列. B ...

最新文章

  1. 在java项目中加载IEDriverServer.exe引用路径
  2. Linux文件系统2---VFS的四个主要对象
  3. Ubuntu批量修改文件名后缀
  4. Spark笔记:复杂RDD的API的理解(上)
  5. zing jvm_Zing加快了JVM应用程序的预热
  6. 大班科学计算机的发明应用教案,大班科学教案:机器人探密
  7. java 读excel
  8. Android学习笔记---23_网络通信之网络图片查看器
  9. 【转】HTML5杂谈 概念与现行游戏 割绳子 宝石迷阵
  10. vue指令和特殊特性
  11. Android Map开发(MrMap源代码)
  12. SSM 实现 RESTful 风格
  13. HDU 3072 (强连通分量)
  14. idea 代码格式化 Spotless 教程
  15. 【有手就行】电脑蓝屏恶搞(附带一键复原方法)
  16. 【亲测可用】win7下移动硬盘无法访问,拒绝访问位置不可用时的解决方案!
  17. 英语六级-day10
  18. spring html导出excel文件,Spring 导出 Excel-Fun言
  19. 边缘计算网关平台发展现状综述
  20. windows PC/SC 常用Scard前缀函数说明

热门文章

  1. Python快速判断素数方法
  2. Qt6.0开发环境搭建
  3. 关于「微软拼音」自定义文本这件事
  4. 抖音上显示内部服务器错误,抖音被限流了怎么办?这里分析了原因和解决方法...
  5. LPVOID傳遞參數的問題
  6. PR/AE/CTA学习笔记
  7. IntelliJ IDEA使用记录:maven projects-compile提示【**类,找不到符号】
  8. Matlap生成正弦波以及正弦波转为方波代码示例
  9. Python操作Word(Win32com)
  10. 前后端分离 -- 深入浅出 Spring Boot + Vue 实现工程项目进度管理系统 Vue不过如此~