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.pswp.cn/news/449373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449373.shtml
英文地址,請注明出處:http://en.pswp.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線圖 如何根據形態選股