Skip to content

Commit f96f3c4

Browse files
committed
RabbitMQ
1 parent 9b45537 commit f96f3c4

File tree

14 files changed

+224
-60
lines changed

14 files changed

+224
-60
lines changed

pom.xml

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,14 @@
6565
<version>1.8.14</version>
6666
</dependency>
6767

68+
<dependency>
69+
<groupId>junit</groupId>
70+
<artifactId>junit</artifactId>
71+
<version>4.12</version>
72+
</dependency>
73+
6874

75+
<!-- ***** devkit ***** -->
6976
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
7077
<dependency>
7178
<groupId>org.projectlombok</groupId>
@@ -98,10 +105,19 @@
98105
</dependency>
99106

100107
<dependency>
101-
<groupId>junit</groupId>
102-
<artifactId>junit</artifactId>
103-
<version>4.12</version>
108+
<groupId>com.rabbitmq</groupId>
109+
<artifactId>amqp-client</artifactId>
110+
<version>5.7.3</version>
104111
</dependency>
112+
113+
<dependency>
114+
<groupId>org.apache.logging.log4j</groupId>
115+
<artifactId>log4j-slf4j-impl</artifactId>
116+
<version>2.13.2</version>
117+
<scope>test</scope>
118+
</dependency>
119+
120+
105121
</dependencies>
106122

107123
<build>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.imzhizi.javalearning.DevKit.AMQP;
2+
3+
import com.rabbitmq.client.Connection;
4+
import com.rabbitmq.client.ConnectionFactory;
5+
6+
import java.io.IOException;
7+
import java.util.concurrent.TimeoutException;
8+
9+
/**
10+
* created by zhizi
11+
* on 5/12/20 21:38
12+
*/
13+
public class MQUtil {
14+
private static ConnectionFactory connectionFactory;
15+
16+
public static Connection getNewConnection() throws IOException, TimeoutException {
17+
if (connectionFactory == null) {
18+
connectionFactory = new ConnectionFactory();
19+
connectionFactory.setHost("localhost");
20+
connectionFactory.setPort(5672);
21+
connectionFactory.setVirtualHost("/just4fun");
22+
connectionFactory.setUsername("just4fun");
23+
connectionFactory.setPassword("just4fun");
24+
}
25+
26+
return connectionFactory.newConnection();
27+
}
28+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package com.imzhizi.javalearning.DevKit.AMQP;
2+
3+
import com.rabbitmq.client.*;
4+
import lombok.SneakyThrows;
5+
6+
import java.io.IOException;
7+
import java.util.concurrent.TimeoutException;
8+
9+
/**
10+
* created by zhizi
11+
* on 5/12/20 17:37
12+
*/
13+
public class WorkerQueue {
14+
static class Producer {
15+
public static void main(String[] args) throws IOException, TimeoutException {
16+
Connection connection = MQUtil.getNewConnection();
17+
Channel channel = connection.createChannel();
18+
// 是否开启持久化
19+
// 是否独占模式
20+
// 消费后是否自动删除
21+
channel.queueDeclare("queue", false, false, true, null);
22+
for (int i = 0; i < 10; i++) {
23+
// 交换机名称,队列名称,消息额外设置,消息内容
24+
channel.basicPublish("", "queue", null, new String(i + "th greeting").getBytes());
25+
// Thread.sleep(1000);
26+
}
27+
channel.basicPublish("", "queue", null, new String("bye bye").getBytes());
28+
channel.basicPublish("", "queue", null, new String("bye bye").getBytes());
29+
channel.close();
30+
connection.close();
31+
}
32+
}
33+
34+
static class Consumer {
35+
public static void main(String[] args) throws IOException, TimeoutException {
36+
Connection connection = MQUtil.getNewConnection();
37+
new Thread(() -> {
38+
try {
39+
Channel channel = connection.createChannel();
40+
channel.basicQos(1);
41+
channel.queueDeclare("queue", false, false, true, null);
42+
quickConsuming(channel);
43+
} catch (IOException e) {
44+
e.printStackTrace();
45+
}
46+
}).start();
47+
new Thread(() -> {
48+
try {
49+
Channel channel = connection.createChannel();
50+
channel.basicQos(1);
51+
channel.queueDeclare("queue", false, false, true, null);
52+
slowConsuming(channel);
53+
} catch (IOException e) {
54+
e.printStackTrace();
55+
}
56+
}).start();
57+
}
58+
59+
static void quickConsuming(Channel channel) throws IOException {
60+
channel.basicConsume("queue", false, new DefaultConsumer(channel) {
61+
@SneakyThrows
62+
@Override
63+
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
64+
String s = new String(body);
65+
System.out.println("Quick " + s);
66+
Thread.sleep(500);
67+
channel.basicAck(envelope.getDeliveryTag(), false);
68+
}
69+
});
70+
}
71+
72+
static void slowConsuming(Channel channel) throws IOException {
73+
channel.basicConsume("queue", false, new DefaultConsumer(channel) {
74+
@SneakyThrows
75+
@Override
76+
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
77+
String s = new String(body);
78+
System.out.println("Slow " + s);
79+
Thread.sleep(1000);
80+
channel.basicAck(envelope.getDeliveryTag(), false);
81+
}
82+
});
83+
}
84+
}
85+
}

src/main/java/com/imzhizi/javalearning/DevKit/内存数据库.java renamed to src/main/java/com/imzhizi/javalearning/DevKit/Redis.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
* created by zhizi
1919
* on 4/22/20 20:56
2020
*/
21-
public class 内存数据库 {
21+
public class Redis {
2222

2323
@Data
2424
static class Order implements Serializable {

src/main/java/com/imzhizi/javalearning/spring/BeanTest.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@
66
import org.springframework.beans.factory.DisposableBean;
77
import org.springframework.beans.factory.InitializingBean;
88
import org.springframework.beans.factory.config.BeanPostProcessor;
9-
import org.springframework.beans.factory.xml.XmlBeanFactory;
10-
import org.springframework.context.ApplicationContext;
11-
import org.springframework.context.support.AbstractApplicationContext;
12-
import org.springframework.context.support.ClassPathXmlApplicationContext;
13-
import org.springframework.core.io.ClassPathResource;
9+
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
10+
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
11+
import org.springframework.context.support.GenericApplicationContext;
12+
import org.springframework.context.support.GenericXmlApplicationContext;
1413

1514
import javax.annotation.PostConstruct;
1615
import javax.annotation.PreDestroy;
@@ -21,6 +20,16 @@
2120
* on 3/13/20 21:41
2221
*/
2322
public class BeanTest {
23+
/**
24+
* 总的来看,在 {@link GenericApplicationContext }之下
25+
* 包含了 {@link GenericXmlApplicationContext } 和 {@link org.springframework.context.annotation.AnnotationConfigApplicationContext } 两个子类
26+
* 一个用于传统的XML格式的容器初始化,一个则应对注解式的容器初始化
27+
* 其中 GenericXmlApplicationContext 使用 XmlBeanDefinitionReader 完成 XML 解析
28+
* 而 AnnotationConfigApplicationContext 则依靠 AnnotatedBeanDefinitionReader 完成 class.config 的解析
29+
*
30+
*/
31+
32+
2433
/**
2534
* 可以看到
2635
* 无论是BeanFactory、还是 ApplicationContext
@@ -29,7 +38,9 @@ public class BeanTest {
2938
*/
3039
@Test
3140
public void BeanFactoryTest() {
32-
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("BeanTest.xml"));
41+
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
42+
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
43+
reader.loadBeanDefinitions("BeanTest.xml");
3344

3445
System.out.println("student");
3546
System.out.println(factory.getBean("student"));
@@ -47,14 +58,14 @@ public void BeanFactoryTest() {
4758

4859
@Test
4960
public void FXAppContextTest() {
50-
ApplicationContext context = new ClassPathXmlApplicationContext("BeanTest.xml");
61+
GenericApplicationContext context = new GenericXmlApplicationContext("BeanTest.xml");
5162
WorkAbility work = (WorkAbility) context.getBean("teacher");
5263
System.out.println(work.getWorkPlace());
5364
}
5465

5566
@Test
5667
public void Bean的初始化和销毁() {
57-
AbstractApplicationContext context = new ClassPathXmlApplicationContext("BeanTest.xml");
68+
GenericApplicationContext context = new GenericXmlApplicationContext("BeanTest.xml");
5869
InitDisBean initDisBean = (InitDisBean) context.getBean("initDisBean");
5970
System.out.println(initDisBean);
6071
WorkAbility work = (WorkAbility) context.getBean("teacher");
@@ -125,11 +136,11 @@ public void destroy() throws Exception {
125136
System.out.println("接口 end");
126137
}
127138

128-
public void init(){
139+
public void init() {
129140
System.out.println("配置 init");
130141
}
131142

132-
public void des(){
143+
public void des() {
133144
System.out.println("配置 des");
134145
}
135146
}

src/main/java/com/imzhizi/javalearning/spring/ConfigurationTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.springframework.context.annotation.Bean;
1212
import org.springframework.context.annotation.Configuration;
1313
import org.springframework.context.annotation.Import;
14+
import org.springframework.context.support.GenericApplicationContext;
1415

1516
import javax.annotation.PostConstruct;
1617
import javax.annotation.PreDestroy;
@@ -32,7 +33,7 @@ public class ConfigurationTest {
3233
*/
3334
@Test
3435
public void test() {
35-
ConfigurableApplicationContext ctx =
36+
GenericApplicationContext ctx =
3637
new AnnotationConfigApplicationContext(EGBeanConfigA.class);
3738
Student student = ctx.getBean(Student.class);
3839
System.out.println(student);

src/main/java/com/imzhizi/javalearning/spring/DITest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import org.junit.Test;
55
import org.springframework.beans.factory.annotation.Autowired;
66
import org.springframework.beans.factory.annotation.Qualifier;
7-
import org.springframework.context.ConfigurableApplicationContext;
8-
import org.springframework.context.support.ClassPathXmlApplicationContext;
7+
import org.springframework.context.support.GenericApplicationContext;
8+
import org.springframework.context.support.GenericXmlApplicationContext;
99

1010
import javax.annotation.PreDestroy;
1111
import javax.annotation.Resource;
@@ -22,7 +22,7 @@ public class DITest {
2222
*/
2323
@Test
2424
public void IOCTest() {
25-
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("DITest.xml");
25+
GenericApplicationContext context = new GenericXmlApplicationContext("DITest.xml");
2626
Teacher teacher = (Teacher) context.getBean("teacher");
2727
System.out.println(teacher);
2828
Student student = (Student) context.getBean("student");

src/main/java/com/imzhizi/javalearning/spring/EventTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import org.springframework.context.event.ContextStartedEvent;
88
import org.springframework.context.event.ContextStoppedEvent;
99
import org.springframework.context.support.ClassPathXmlApplicationContext;
10+
import org.springframework.context.support.GenericApplicationContext;
11+
import org.springframework.context.support.GenericXmlApplicationContext;
1012

1113
/**
1214
* created by zhizi
@@ -19,8 +21,8 @@ public class EventTest {
1921
*/
2022
@Test
2123
public void 事件处理器测试() {
22-
ConfigurableApplicationContext context =
23-
new ClassPathXmlApplicationContext("EventTest.xml");
24+
GenericApplicationContext context =
25+
new GenericXmlApplicationContext("EventTest.xml");
2426
context.start();
2527
EGBean egBean = (EGBean) context.getBean("egBean");
2628
System.out.println(egBean);
@@ -64,7 +66,7 @@ public void onApplicationEvent(ContextClosedEvent event) {
6466
*/
6567
@Test
6668
public void 自定义事件测试() {
67-
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("EventTest.xml");
69+
GenericApplicationContext context = new GenericXmlApplicationContext("EventTest.xml");
6870
CustomEventPublisher cvp = (CustomEventPublisher) context.getBean("customEventPublisher");
6971
cvp.publish();
7072
cvp.publish();

src/main/java/com/imzhizi/javalearning/语言基础/a接口.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
import lombok.Data;
44
import org.junit.Test;
55

6-
import java.sql.DriverManager;
7-
86
/**
97
* created by zhizi
108
* on 3/25/20 09:12

src/main/java/com/imzhizi/javalearning/语言基础/r并发组件.java renamed to src/main/java/com/imzhizi/javalearning/语言基础/r同步组件.java

Lines changed: 5 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22

33
import org.junit.Test;
44

5-
import java.util.concurrent.*;
5+
import java.util.concurrent.BrokenBarrierException;
6+
import java.util.concurrent.CountDownLatch;
7+
import java.util.concurrent.CyclicBarrier;
8+
import java.util.concurrent.Semaphore;
69
import java.util.concurrent.locks.*;
710

811
/**
912
* created by zhizi
1013
* on 4/17/20 09:05
1114
*/
12-
public class r并发组件 {
15+
public class r同步组件 {
1316

1417
/**
1518
* Java 中定义了一个名为 AbstractQueuedSynchronizer 的抽象类
@@ -57,7 +60,6 @@ public void NodeTest() {
5760
}
5861
}
5962

60-
6163
/**
6264
* 如果多个线程都存在于同步队列中,即便尝试 unpark 后面的线程
6365
* 也只是会再次判断自己能否获取锁,然后再次park
@@ -213,33 +215,4 @@ public static void main(String[] args) {
213215
semaphore.acquire();
214216
semaphore.release();
215217
}
216-
217-
/**
218-
* 数据结构
219-
* table[] 装载Node数组
220-
* nextTable[] 要启用的下一个table,只有在扩容的时候 non-null
221-
* baseCount:base的计数器,主要在没有竞争的时候使用
222-
* sizeCtl - 用于table的初始化和扩容
223-
* - 未初始化时,sizeCtl表示初始容量, 初始化后表示扩容的阈值,为当前数组长度length*0.75
224-
* - -1:table正在初始化_(initTable()中CAS更改)_
225-
* - 小于-1代表 -(扩容线程数+1)
226-
* transferIndex:还不理解
227-
* cellsBusy:扩容和创建 counterCells 时的自旋锁
228-
* counterCells: counterCell 数组,长度为2的幂
229-
* <p>
230-
* Node 的数据结构 hash、key、val、next
231-
* ForwardingNode 继承自Node,是执行扩容操作时被插在桶的头部的结点
232-
* 增加了一个成员变量 nextTable(Node[])
233-
* <p>
234-
* resizeStamp
235-
* <p>
236-
* index 的计算方法为 hash&(n-1),hash = h^(h>>>16) & 0x7fffffff
237-
* 这个 0x7fffffff 有什么用之后才能看到
238-
* <p>
239-
* 扩容方法是 transfer
240-
*/
241-
@Test
242-
public void 并发哈希表() {
243-
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
244-
}
245218
}

0 commit comments

Comments
 (0)