|
@@ -3,10 +3,16 @@ package org.hswebframework.web.message.redis;
|
|
import org.hswebframework.web.message.Message;
|
|
import org.hswebframework.web.message.Message;
|
|
import org.hswebframework.web.message.MessageSubject;
|
|
import org.hswebframework.web.message.MessageSubject;
|
|
import org.hswebframework.web.message.MessageSubscribe;
|
|
import org.hswebframework.web.message.MessageSubscribe;
|
|
|
|
+import org.hswebframework.web.message.support.QueueMessageSubject;
|
|
import org.hswebframework.web.message.support.TopicMessageSubject;
|
|
import org.hswebframework.web.message.support.TopicMessageSubject;
|
|
-import org.hswebframework.web.message.support.UserMessageSubject;
|
|
|
|
-import org.redisson.api.*;
|
|
|
|
-import org.redisson.codec.SerializationCodec;
|
|
|
|
|
|
+import org.redisson.api.RCountDownLatch;
|
|
|
|
+import org.redisson.api.RQueue;
|
|
|
|
+import org.redisson.api.RTopic;
|
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
|
+import org.redisson.client.codec.Codec;
|
|
|
|
+import org.redisson.codec.JsonJacksonCodec;
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
@@ -16,15 +22,17 @@ import java.util.function.Consumer;
|
|
* @author zhouhao
|
|
* @author zhouhao
|
|
*/
|
|
*/
|
|
public class RedissionMessageSubscribe<M extends Message> implements MessageSubscribe<M> {
|
|
public class RedissionMessageSubscribe<M extends Message> implements MessageSubscribe<M> {
|
|
- private MessageSubject iam;
|
|
|
|
|
|
+ private MessageSubject subject;
|
|
private RedissonClient redisson;
|
|
private RedissonClient redisson;
|
|
private boolean running = false;
|
|
private boolean running = false;
|
|
private int listenerId = 0;
|
|
private int listenerId = 0;
|
|
private List<Consumer<M>> consumers = new ArrayList<>();
|
|
private List<Consumer<M>> consumers = new ArrayList<>();
|
|
private RTopic<M> topic;
|
|
private RTopic<M> topic;
|
|
|
|
|
|
- public RedissionMessageSubscribe(MessageSubject iam, RedissonClient redisson) {
|
|
|
|
- this.iam = iam;
|
|
|
|
|
|
+ private Logger logger = LoggerFactory.getLogger(this.getClass());
|
|
|
|
+
|
|
|
|
+ public RedissionMessageSubscribe(MessageSubject subject, RedissonClient redisson) {
|
|
|
|
+ this.subject = subject;
|
|
this.redisson = redisson;
|
|
this.redisson = redisson;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -32,12 +40,6 @@ public class RedissionMessageSubscribe<M extends Message> implements MessageSubs
|
|
this.redisson = redisson;
|
|
this.redisson = redisson;
|
|
}
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
|
- public MessageSubscribe<M> iam(MessageSubject iam) {
|
|
|
|
- this.iam = iam;
|
|
|
|
- return this;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
@Override
|
|
@Override
|
|
public MessageSubscribe<M> onMessage(Consumer<M> consumer) {
|
|
public MessageSubscribe<M> onMessage(Consumer<M> consumer) {
|
|
consumers.add(consumer);
|
|
consumers.add(consumer);
|
|
@@ -57,13 +59,13 @@ public class RedissionMessageSubscribe<M extends Message> implements MessageSubs
|
|
consumers.clear();
|
|
consumers.clear();
|
|
}
|
|
}
|
|
|
|
|
|
- private static SerializationCodec codec = new SerializationCodec();
|
|
|
|
|
|
+ private static Codec codec = JsonJacksonCodec.INSTANCE;
|
|
|
|
|
|
private void doRun() {
|
|
private void doRun() {
|
|
- if (iam instanceof UserMessageSubject) {
|
|
|
|
- RQueue<M> queue = redisson
|
|
|
|
- .getQueue("queue_user_" + ((UserMessageSubject) iam).getUserId(), codec);
|
|
|
|
- RCountDownLatch countDownLatch = redisson.getCountDownLatch("cdl_user_" + ((UserMessageSubject) iam).getUserId());
|
|
|
|
|
|
+ if (subject instanceof QueueMessageSubject) {
|
|
|
|
+ String queueName = ((QueueMessageSubject) subject).getQueueName();
|
|
|
|
+ RQueue<M> queue = redisson.getQueue(queueName, codec);
|
|
|
|
+ RCountDownLatch countDownLatch = redisson.getCountDownLatch("cdl_" + queueName);
|
|
Thread thread = new Thread(() -> {
|
|
Thread thread = new Thread(() -> {
|
|
while (running) {
|
|
while (running) {
|
|
try {
|
|
try {
|
|
@@ -75,11 +77,9 @@ public class RedissionMessageSubscribe<M extends Message> implements MessageSubs
|
|
cons.accept(message);
|
|
cons.accept(message);
|
|
});
|
|
});
|
|
} catch (InterruptedException e) {
|
|
} catch (InterruptedException e) {
|
|
- try {
|
|
|
|
- Thread.sleep(1000);
|
|
|
|
- } catch (InterruptedException e1) {
|
|
|
|
- e1.printStackTrace();
|
|
|
|
- }
|
|
|
|
|
|
+ running = false;
|
|
|
|
+ logger.error("queue consumer thread interrupted", e);
|
|
|
|
+ Thread.currentThread().interrupt();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
@@ -87,8 +87,8 @@ public class RedissionMessageSubscribe<M extends Message> implements MessageSubs
|
|
thread.start();
|
|
thread.start();
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- if (iam instanceof TopicMessageSubject) {
|
|
|
|
- topic = redisson.getTopic("topic_" + ((TopicMessageSubject) iam).getTopic(), codec);
|
|
|
|
|
|
+ if (subject instanceof TopicMessageSubject) {
|
|
|
|
+ topic = redisson.getTopic("topic_" + ((TopicMessageSubject) subject).getTopic(), codec);
|
|
listenerId = topic.addListener((channel, msg) -> consumers.forEach(cons -> cons.accept(msg)));
|
|
listenerId = topic.addListener((channel, msg) -> consumers.forEach(cons -> cons.accept(msg)));
|
|
}
|
|
}
|
|
running = true;
|
|
running = true;
|