spring集成多个rabbitMQ

转自:https://blog.csdn.net/zz775854904/article/details/81092892

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求..

开始正题!

在开发之前需要下载rabbitmq, 而在rabbitmq安装之前,童鞋们需要安装erlang, 因为rabbitmq是用erlang写的.

安装完毕之后,我们建立一个maven项目.然后我们开始配置项目.

  1. <!-- spring版本号 -->
  2. <spring.version>3.2.8.RELEASE</spring.version>
  3. <!-- 添加Spring依赖 -->
  4. <dependency>
  5. <groupId>org.springframework</groupId>
  6. <artifactId>spring-core</artifactId>
  7. <version>${spring.version}</version>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-webmvc</artifactId>
  12. <version>${spring.version}</version>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-context</artifactId>
  17. <version>${spring.version}</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-context-support</artifactId>
  22. <version>${spring.version}</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework</groupId>
  26. <artifactId>spring-aop</artifactId>
  27. <version>${spring.version}</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework</groupId>
  31. <artifactId>spring-aspects</artifactId>
  32. <version>${spring.version}</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework</groupId>
  36. <artifactId>spring-tx</artifactId>
  37. <version>${spring.version}</version>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework</groupId>
  41. <artifactId>spring-jdbc</artifactId>
  42. <version>${spring.version}</version>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.springframework</groupId>
  46. <artifactId>spring-web</artifactId>
  47. <version>${spring.version}</version>
  48. </dependency>
 

由于是spring整合,我们需要加入spring的依赖.

  1. <!--rabbitmq依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.amqp</groupId>
  4. <artifactId>spring-rabbit</artifactId>
  5. <version>1.3.5.RELEASE</version>
  6. </dependency>

依赖加好了之后, 我们需要定义消息生产者和消息发送者.

由于exchange有几种,这里我只测试了两种, 通过分别定义两个exchange去绑定direct和topic..

首先, 定义消息生产者, 通过配置将template链接connect-factory并注入到代码中使用.

  1. package com.chris.producer;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.amqp.core.AmqpTemplate;
  5. import org.springframework.stereotype.Service;
  6. import javax.annotation.Resource;
  7. import java.io.IOException;
  8. /**
  9. * Created by wuxing on 2016/9/21.
  10. */
  11. @Service
  12. public class MessageProducer {
  13. private Logger logger = LoggerFactory.getLogger(MessageProducer.class);
  14. @Resource(name="amqpTemplate")
  15. private AmqpTemplate amqpTemplate;
  16. @Resource(name="amqpTemplate2")
  17. private AmqpTemplate amqpTemplate2;
  18. public void sendMessage(Object message) throws IOException {
  19. logger.info("to send message:{}", message);
  20. amqpTemplate.convertAndSend("queueTestKey", message);
  21. amqpTemplate.convertAndSend("queueTestChris", message);
  22. amqpTemplate2.convertAndSend("wuxing.xxxx.wsdwd", message);
  23. }
  24. }
 

然后我们定义消息消费者, 这里,我定义了三个消费者, 通过监听消息队列, 分别接受各自所匹配的消息.

第一个消费者, 接受direct的消息, 他的exchange为exchangeTest,  rout-key为queueTestKey

  1. package com.chris.consumer;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.amqp.core.Message;
  5. import org.springframework.amqp.core.MessageListener;
  6. /**
  7. * Created by wuxing on 2016/9/21.
  8. */
  9. public class MessageConsumer implements MessageListener {
  10. private Logger logger = LoggerFactory.getLogger(MessageConsumer.class);
  11. @Override
  12. public void onMessage(Message message) {
  13. logger.info("consumer receive message------->:{}", message);
  14. }
  15. }
 

第二个消费者, 接受direct的消息(为了测试一个exchange可以发送多个消息), 他的exchange为exchangeTest,  rout-key为queueTestChris.

  1. package com.chris.consumer;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.amqp.core.Message;
  5. import org.springframework.amqp.core.MessageListener;
  6. /**
  7. * Created by wuxing on 2016/9/21.
  8. */
  9. public class ChrisConsumer implements MessageListener {
  10. private Logger logger = LoggerFactory.getLogger(ChrisConsumer.class);
  11. @Override
  12. public void onMessage(Message message) {
  13. logger.info("chris receive message------->:{}", message);
  14. }
  15. }


第三个消费者, 接受topic的消息他的exchange为exchangeTest2,  pattern为wuxing.*.. 网上说.*可以匹配一个, .#可以匹配一个或多个..但是笔者好像两个都试了..都可以匹配一个或多个..不知道什么鬼...

  1. package com.chris.consumer;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.amqp.core.Message;
  5. import org.springframework.amqp.core.MessageListener;
  6. /**
  7. * Created by wuxing on 2016/9/21.
  8. */
  9. public class WuxingConsumer implements MessageListener {
  10. private Logger logger = LoggerFactory.getLogger(WuxingConsumer.class);
  11. @Override
  12. public void onMessage(Message message) {
  13. logger.info("wuxing receive message------->:{}", message);
  14. }
  15. }
 

然后就是关键的地方了..rabbit整合spring的配置文件.

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  6. http://www.springframework.org/schema/rabbit
  7. http://www.springframework.org/schema/rabbit/spring-rabbit-1.2.xsd">
  8. <!--配置connection-factory,指定连接rabbit server参数 -->
  9. <rabbit:connection-factory id="connectionFactory"
  10. username="guest" password="guest" host="localhost" port="5672" />
  11. <!--定义rabbit template用于数据的接收和发送 -->
  12. <rabbit:template id="amqpTemplate" connection-factory="connectionFactory"
  13. exchange="exchangeTest"/>
  14. <!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
  15. <rabbit:admin id="connectAdmin" connection-factory="connectionFactory"/>
  16. <!--定义queue -->
  17. <rabbit:queue name="queueTest" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin"/>
  18. <!-- 定义direct exchange,绑定queueTest -->
  19. <rabbit:direct-exchange name="exchangeTest" durable="true" auto-delete="false" declared-by="connectAdmin">
  20. <rabbit:bindings>
  21. <rabbit:binding queue="queueTest" key="queueTestKey"></rabbit:binding>
  22. </rabbit:bindings>
  23. </rabbit:direct-exchange>
  24. <!-- 消息接收者 -->
  25. <bean id="messageReceiver" class="com.chris.consumer.MessageConsumer"></bean>
  26. <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象-->
  27. <rabbit:listener-container connection-factory="connectionFactory">
  28. <rabbit:listener queues="queueTest" ref="messageReceiver"/>
  29. </rabbit:listener-container>
  30. <!--定义queue -->
  31. <rabbit:queue name="queueChris" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin"/>
  32. <!-- 定义direct exchange,绑定queueTest -->
  33. <rabbit:direct-exchange name="exchangeTest" durable="true" auto-delete="false" declared-by="connectAdmin">
  34. <rabbit:bindings>
  35. <rabbit:binding queue="queueChris" key="queueTestChris"></rabbit:binding>
  36. </rabbit:bindings>
  37. </rabbit:direct-exchange>
  38. <!-- 消息接收者 -->
  39. <bean id="receiverChris" class="com.chris.consumer.ChrisConsumer"></bean>
  40. <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象-->
  41. <rabbit:listener-container connection-factory="connectionFactory">
  42. <rabbit:listener queues="queueChris" ref="receiverChris"/>
  43. </rabbit:listener-container>
  44. <!-- 分隔线 -->
  45. <!--配置connection-factory,指定连接rabbit server参数 -->
  46. <rabbit:connection-factory id="connectionFactory2"
  47. username="guest" password="guest" host="localhost" port="5672"/>
  48. <!--定义rabbit template用于数据的接收和发送 -->
  49. <rabbit:template id="amqpTemplate2" connection-factory="connectionFactory2"
  50. exchange="exchangeTest2"/>
  51. <!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
  52. <rabbit:admin id="connectAdmin2" connection-factory="connectionFactory2"/>
  53. <!--定义queue -->
  54. <rabbit:queue name="queueWuxing" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin2"/>
  55. <!-- 定义direct exchange,绑定queueTest -->
  56. <rabbit:topic-exchange name="exchangeTest2" durable="true" auto-delete="false" declared-by="connectAdmin2">
  57. <rabbit:bindings>
  58. <rabbit:binding queue="queueWuxing" pattern="wuxing.*"></rabbit:binding>
  59. </rabbit:bindings>
  60. </rabbit:topic-exchange>
  61. <!-- 消息接收者 -->
  62. <bean id="recieverWuxing" class="com.chris.consumer.WuxingConsumer"></bean>
  63. <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象-->
  64. <rabbit:listener-container connection-factory="connectionFactory2" >
  65. <rabbit:listener queues="queueWuxing" ref="recieverWuxing"/>
  66. </rabbit:listener-container>
  67. </beans>

 

这里,有个问题笔者研究了好久...就是如何定义两个exchange, 一开始一直不成功..直到找到了一篇国外的文章才解决...

定义两个exchange的时候, 需要用到declared-by..

而这个必须要引入下面的这个申明, 才有..

  1. http://www.springframework.org/schema/rabbit
  2. http://www.springframework.org/schema/rabbit/spring-rabbit-1.2.xsd">

 

文件中大概的配置解释一下.

connect-factory进行连接rabbitmq服务.

template用于连接factory并指定exchange, 这上面还能直接指定rout-key.

admin相当于一个管理员的角色..可以将exchange和queue进行管理, 

queue和topic-exchange分别定义队列和路由器, 这里需要用declared-by指定管理员,从而连接到相应的factory.

listener-container用于消费者的监听(其实,rabbit配置中是可以指定某个类的某个方法的, 但是笔者失败了, 还在试验中...)

这里还有一个问题...需要大家注意..

当一个exchange绑定了一种类型之后, 这个exchange在配置就不能再换成另一种了.会一直报错, received 'direct' but current is 'topic'  类似这种..

笔者这个也是被坑了若干时间去找问题...

 

然后贴下spring的基本配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  5. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
  6. <import resource="classpath*:rabbitmq.xml" />
  7. <!-- 扫描指定package下所有带有如@controller,@services,@resource,@ods并把所注释的注册为Spring Beans -->
  8. <context:component-scan base-package="com.chris.consumer, com.chris.producer" />
  9. <!-- 激活annotation功能 -->
  10. <context:annotation-config />
  11. <!-- 激活annotation功能 -->
  12. <context:spring-configured />
  13. </beans>

 

然后是单元测试类, 这里通过输出100-1慢慢递减,去观察控制台消费者接收消息的情况.

  1. package com.chris;
  2. import com.chris.producer.MessageProducer;
  3. import org.junit.Before;
  4. import org.junit.Test;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.context.ApplicationContext;
  8. import org.springframework.context.support.ClassPathXmlApplicationContext;
  9. /**
  10. * Created by wuxing on 2016/9/21.
  11. */
  12. public class MessageTest {
  13. private Logger logger = LoggerFactory.getLogger(MessageTest.class);
  14. private ApplicationContext context = null;
  15. @Before
  16. public void setUp() throws Exception {
  17. context = new ClassPathXmlApplicationContext("application.xml");
  18. }
  19. @Test
  20. public void should_send_a_amq_message() throws Exception {
  21. MessageProducer messageProducer = (MessageProducer) context.getBean("messageProducer");
  22. int a = 100;
  23. while (a > 0) {
  24. messageProducer.sendMessage("Hello, I am amq sender num :" + a--);
  25. try {
  26. //暂停一下,好让消息消费者去取消息打印出来
  27. Thread.sleep(1000);
  28. } catch (InterruptedException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. }
  33. }



然后控制台的结果如下(这里只贴出关键信息, 其他配置的log的省略了)

  1. 2016-09-22 16:15:00,330 [main] INFO [com.chris.producer.MessageProducer] - to send message:Hello, I am amq sender num :100
  2. 2016-09-22 16:15:00,348 [main] DEBUG [org.springframework.amqp.rabbit.connection.CachingConnectionFactory] - Creating cached Rabbit Channel from AMQChannel(amqp://guest@127.0.0.1:5672/,3)
  3. 2016-09-22 16:15:00,348 [main] DEBUG [org.springframework.amqp.rabbit.core.RabbitTemplate] - Executing callback on RabbitMQ Channel: Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,3)
  4. 2016-09-22 16:15:00,349 [main] DEBUG [org.springframework.amqp.rabbit.core.RabbitTemplate] - Publishing message on exchange [exchangeTest], routingKey = [queueTestKey]
  5. 2016-09-22 16:15:00,357 [main] DEBUG [org.springframework.amqp.rabbit.core.RabbitTemplate] - Executing callback on RabbitMQ Channel: Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,3)
  6. 2016-09-22 16:15:00,358 [main] DEBUG [org.springframework.amqp.rabbit.core.RabbitTemplate] - Publishing message on exchange [exchangeTest], routingKey = [queueTestChris]
  7. 2016-09-22 16:15:00,368 [main] DEBUG [org.springframework.amqp.rabbit.connection.CachingConnectionFactory] - Creating cached Rabbit Channel from AMQChannel(amqp://guest@127.0.0.1:5672/,2)
  8. 2016-09-22 16:15:00,369 [main] DEBUG [org.springframework.amqp.rabbit.core.RabbitTemplate] - Executing callback on RabbitMQ Channel: Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,2)
  9. 2016-09-22 16:15:00,369 [main] DEBUG [org.springframework.amqp.rabbit.core.RabbitTemplate] - Publishing message on exchange [exchangeTest2], routingKey = [wuxing.xxxx.wsdwd]
  10. 2016-09-22 16:15:00,370 [pool-1-thread-6] DEBUG [org.springframework.amqp.rabbit.listener.BlockingQueueConsumer] - Storing delivery for Consumer: tags=[[amq.ctag-hyW85GZHk-AHLLFJUmNLDQ]], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,1), acknowledgeMode=AUTO local queue size=0
  11. 2016-09-22 16:15:00,372 [SimpleAsyncTaskExecutor-1] DEBUG [org.springframework.amqp.rabbit.listener.BlockingQueueConsumer] - Received message: (Body:'Hello, I am amq sender num :100'MessageProperties [headers={}, timestamp=null, messageId=null, userId=null, appId=null, clusterId=null, type=null, correlationId=null, replyTo=null, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, deliveryMode=PERSISTENT, expiration=null, priority=0, redelivered=false, receivedExchange=exchangeTest, receivedRoutingKey=queueTestKey, deliveryTag=1, messageCount=0])
  12. 2016-09-22 16:15:00,373 [SimpleAsyncTaskExecutor-1] INFO [com.chris.consumer.MessageConsumer] - consumer receive message------->:(Body:'Hello, I am amq sender num :100'MessageProperties [headers={}, timestamp=null, messageId=null, userId=null, appId=null, clusterId=null, type=null, correlationId=null, replyTo=null, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, deliveryMode=PERSISTENT, expiration=null, priority=0, redelivered=false, receivedExchange=exchangeTest, receivedRoutingKey=queueTestKey, deliveryTag=1, messageCount=0])
  13. 2016-09-22 16:15:00,374 [SimpleAsyncTaskExecutor-1] DEBUG [org.springframework.amqp.rabbit.listener.BlockingQueueConsumer] - Retrieving delivery for Consumer: tags=[[amq.ctag-hyW85GZHk-AHLLFJUmNLDQ]], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,1), acknowledgeMode=AUTO local queue size=0
  14. 2016-09-22 16:15:00,379 [pool-2-thread-4] DEBUG [org.springframework.amqp.rabbit.listener.BlockingQueueConsumer] - Storing delivery for Consumer: tags=[[amq.ctag-T-c1red0T_HHyCFfpXLYIQ]], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,1), acknowledgeMode=AUTO local queue size=0
  15. 2016-09-22 16:15:00,381 [SimpleAsyncTaskExecutor-1] DEBUG [org.springframework.amqp.rabbit.listener.BlockingQueueConsumer] - Received message: (Body:'Hello, I am amq sender num :100'MessageProperties [headers={}, timestamp=null, messageId=null, userId=null, appId=null, clusterId=null, type=null, correlationId=null, replyTo=null, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, deliveryMode=PERSISTENT, expiration=null, priority=0, redelivered=false, receivedExchange=exchangeTest2, receivedRoutingKey=wuxing.xxxx.wsdwd, deliveryTag=1, messageCount=0])
  16. 2016-09-22 16:15:00,382 [SimpleAsyncTaskExecutor-1] INFO [com.chris.consumer.WuxingConsumer] - wuxing receive message------->:(Body:'Hello, I am amq sender num :100'MessageProperties [headers={}, timestamp=null, messageId=null, userId=null, appId=null, clusterId=null, type=null, correlationId=null, replyTo=null, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, deliveryMode=PERSISTENT, expiration=null, priority=0, redelivered=false, receivedExchange=exchangeTest2, receivedRoutingKey=wuxing.xxxx.wsdwd, deliveryTag=1, messageCount=0])
  17. 2016-09-22 16:15:00,383 [SimpleAsyncTaskExecutor-1] DEBUG [org.springframework.amqp.rabbit.listener.BlockingQueueConsumer] - Retrieving delivery for Consumer: tags=[[amq.ctag-T-c1red0T_HHyCFfpXLYIQ]], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,1), acknowledgeMode=AUTO local queue size=0
  18. 2016-09-22 16:15:00,396 [pool-1-thread-5] DEBUG [org.springframework.amqp.rabbit.listener.BlockingQueueConsumer] - Storing delivery for Consumer: tags=[[amq.ctag-h5ERpaWrnqmkNhbfM7S8Ww]], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,2), acknowledgeMode=AUTO local queue size=0
  19. 2016-09-22 16:15:00,397 [SimpleAsyncTaskExecutor-1] DEBUG [org.springframework.amqp.rabbit.listener.BlockingQueueConsumer] - Received message: (Body:'Hello, I am amq sender num :100'MessageProperties [headers={}, timestamp=null, messageId=null, userId=null, appId=null, clusterId=null, type=null, correlationId=null, replyTo=null, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, deliveryMode=PERSISTENT, expiration=null, priority=0, redelivered=false, receivedExchange=exchangeTest, receivedRoutingKey=queueTestChris, deliveryTag=1, messageCount=0])
  20. 2016-09-22 16:15:00,398 [SimpleAsyncTaskExecutor-1] INFO [com.chris.consumer.ChrisConsumer] - chris receive message------->:(Body:'Hello, I am amq sender num :100'MessageProperties [headers={}, timestamp=null, messageId=null, userId=null, appId=null, clusterId=null, type=null, correlationId=null, replyTo=null, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, deliveryMode=PERSISTENT, expiration=null, priority=0, redelivered=false, receivedExchange=exchangeTest, receivedRoutingKey=queueTestChris, deliveryTag=1, messageCount=0])


我们可以看到生产者有发出一个信息, 然后发布在了三个通道上.

 

1. on exchange [exchangeTest] , routingKey = [queueTestKey]

2. on exchange [exchangeTest] , routingKey = [queueTestChris]

3. on exchange [exchangeTest2] , routingKey = [wuxing.xxxx.wsdwd]

 

然后三个消费者分别收到了他们的消息..至此, 整个test就结束了.

对项目有兴趣的童鞋可以拿项目的源码玩一玩  源码在这里

转载于:https://www.cnblogs.com/sharpest/p/10428953.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决(springboot项目)mysql表名大写,造成jpa Table doesn't exist问题

这个问题有2种解决方法&#xff1a; 我的报错是&#xff1a;java.sql.SQLSyntaxErrorException: Table gaei_ms.gaei_work_task doesnt exist方法一&#xff1a; 转自&#xff1a;https://confluence.atlassian.com/fishkb/table-xxx-doesn-t-exist-error-with-mysql-server-30…

一个三流学校程序员的奋斗历程

写作用意 这些日子我一直在写一个实时操作系统内核&#xff0c;已有小成了&#xff0c;等写完我会全部公开&#xff0c;希望能够为国内IT的发展尽自己一份微薄的力量。最近看到很多学生朋友和我当年一样没有方向&#xff0c;所以把我的经历写出来与大家共勉&#xff0c;希望能…

真格量化——做空波动率策略

# coding:utf-8 #!/usr/bin/env python # EmuCounter2 from PoboAPI import * import datetime import numpy as np#开始时间,用于初始化一些参数 def OnStart(context) :print "system starting..."#设定全局变量品种g.code1 = "m1901-C-3300.DCE" #豆粕…

搭建webpack基础配置

搭建webpack基础步骤&#xff1a; 1.去官方网站下载node.js&#xff08;根据自己电脑的系统类型选择&#xff09; 2.安装node.js完成后打开cmd命令提示符&#xff1a; 出现版本号证明安装成功 3.cd到工程目录下 npm install -g vue-cli&#xff08;这里使用的是vue-cli脚手架安…

JPA 中 sql 预编译 -- EntityManager 使用 预编译

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 实现方式 &#xff1a; 1. 注入em: PersistenceContextprivate EntityManager entityManager; 注入方式 2&#xff1a; PersistenceUn…

持续记函数

自己写文章的缘由 juejin.im/post/5c7368… 2019年2月26日 星期二 array_shift — 将数组开头的单元移出数组 <?php $stack array("orange", "banana", "apple", "raspberry"); $fruit array_shift($stack); print_r($stack); ?…

研究:多感官教学增强记忆 学习效率事半功倍

人们在记忆外部信息时&#xff0c;必须先要去接受这些信息&#xff0c;而接受信息的“通道”不止一个&#xff0c;有视觉、听觉、嗅觉、味觉、触觉等等。有多种感官参加的记忆叫做“多通道”记忆。图为台中一幼稚园户外写生活动。 生动的教学方法往往可以吸引大多数孩子&#…

330 div+css Experience

今天学习的div&#xff0c;感觉对编辑html更为方便快捷&#xff0c;但还是需要多练&#xff0c;多熟悉一下思路和逻辑方式 越来越感觉&#xff0c;代码不是重要的&#xff0c;重要的是方向和思路&#xff0c;am的float clearfloat 及属性&#xff0c;还有overflow 溢出的三个属…

时间序列的平稳性检验方法汇总

时间序列平稳性检验方法&#xff0c;可分为三类&#xff1a; 图形分析方法 简单统计方法 假设检验方法 一、图形分析方法 可视化数据 可视化数据即绘制时间序列的折线图&#xff0c;看曲线是否围绕某一数值上下波动&#xff08;判断均值是否稳定&#xff09;&#xff0c;看…

tcp的发送端一个小包就能打破对端的delay_ack么?

3.10内核&#xff0c;反向合入4.9的bbr。 最近分析bbr的时候&#xff0c;收集了线上的一些报文&#xff0c;其中有一个疑问一直在我脑海里面&#xff0c;如下&#xff1a; 本身处于delay_ack状态的客户端&#xff0c;大概40ms回复一个delay_ack&#xff0c;当收到一个490字节的…

设置 git pull 无需输入账号和密码

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 如果你用git从远程pull拉取代码&#xff0c;每次都要输入密码&#xff0c;那么执行下面命令即可 git config --global credential.help…

Git 诞生记

你可能有过这样的经历&#xff1a;在 debug 的时候这里加一句&#xff0c;那里减一句&#xff0c;顺便改改参数&#xff0c;不一会你的程序就从一个 bug 增加到了无数个 bug 。最重要的是&#xff0c;你完全想不起来自己到底改了几个地方&#xff0c;原来的程序到底长什么样子了…

使用pandas进行量化回测(akshare)

本人看法&#xff0c;也就比excel高级一点&#xff0c;距离backtrader这些框架又差一点。做最基础的测试可以&#xff0c;如果后期加入加仓功能&#xff0c;或者是止盈止损等功能&#xff0c;很不合适。只能做最简单的技术指标测试。所以别太当回事。 导包&#xff0c;常用包导…

【BZOJ4543】【POI2014】Hotel加强版(长链剖分)

传送门 题意&#xff1a;求树上满足三点之间距离两两相等的三元组个数 n≤1e5n\le 1e5n≤1e5 原题数据是n≤5000n\le5000n≤5000 考虑怎么做f[u][i]f[u][i]f[u][i]表示uuu为根&#xff0c;深度为iii的点的个数g[u][i]g[u][i]g[u][i]表示uuu为根&#xff0c;满足2点到lcalcalca的…

使用vue+webpack从零搭建项目

vue到现在已经成为一个热门的框架&#xff0c;在项目实践当中&#xff0c;如果想要创建一个新项目&#xff0c;通常都会使用vue-cli的脚手架工具&#xff0c;毋容置疑能够方便很多&#xff0c;很多东西也不需要自己亲自去配置。都知道&#xff0c;脚手架其实是vue结合webpack去…

CentOS 6 和 CentOS 7 防火墙的关闭

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。CentOS6.5查看防火墙的状态&#xff1a; 1[linuxidclocalhost ~]$service iptable status显示结果&#xff1a; 12345[linuxidclocalhost …

怎样从Linux终端管理进程:10个你必须知道的命令

本文由 极客范 - Ben Zhang 翻译自 Chris Hoffman。欢迎加入极客翻译小组&#xff0c;同我们一道翻译与分享。转载请参见文章末尾处的要求。Linux终端有一系列有用的命令。它们可以显示正在运行的进程、杀死进程和改变进程的优先级。本文列举了一些经典传统的命令和一些有用新…

易盛极星多合约回测(问题很多)

注意&#xff0c;使用此函数&#xff0c;在考虑手续费时&#xff0c;无法做到统一。 import talib import numpy as np import EsTalib from EsSeries import NumericSeries# 策略参数字典 g_params[p1] 5 g_params[p2] 10 g_params[p3] 120 g_params[ZQ] 5 #交易周期…

Qt 程序获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法

Qt 程序获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法 经常我们的程序中需要访问一些特殊的路径&#xff0c;比如程序所在的路径、用户目录路径、临时文件夹等。在 Qt 中实现这几个功能所用的方法虽然都不难&#xff0c;但是各不相同&#xff0c;每次用到时还要…

搞了个30天学习量化的数据资料,可以bt做全球。数据链接白送

待会上传代码,资料,打包好了,拿来就能用。累死我了,搞了两天,必须收费,绝不允许白嫖。不然对不起我熬夜,那么辛苦。 确定后,扫描百度网盘 链接:https://pan.baidu.com/s/1C0k6zkjHchFVQaHe4nRMsg?pwd=kkgb 提取码:kkgb 如何回测k线图 如何根据形态选股