Commit b9f516a51355ccde77f1f29feb03e7fbea0582c4

Authored by zhangdaiscott
1 parent ae917438

消息队列中报微服务异常 issues/I4977W

jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/mqtoken/TransmitUserTokenFilter.java 0 → 100644
  1 +package org.jeecg.common.config.mqtoken;
  2 +
  3 +import javax.servlet.*;
  4 +import javax.servlet.http.HttpServletRequest;
  5 +import java.io.IOException;
  6 +
  7 +/**
  8 + * 存放token到上下文供队列调用feign使用
  9 + * @author zyf
  10 + */
  11 +public class TransmitUserTokenFilter implements Filter {
  12 +
  13 + private static String X_ACCESS_TOKEN="X-Access-Token";
  14 +
  15 + public TransmitUserTokenFilter() {
  16 + }
  17 +
  18 + @Override
  19 + public void init(FilterConfig filterConfig) throws ServletException {
  20 + }
  21 +
  22 + @Override
  23 + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  24 + this.initUserInfo((HttpServletRequest) request);
  25 + chain.doFilter(request, response);
  26 + }
  27 +
  28 + private void initUserInfo(HttpServletRequest request) {
  29 + String token = request.getHeader(X_ACCESS_TOKEN);
  30 + if (token!=null) {
  31 + try {
  32 + //将token放入上下文中
  33 + UserTokenContext.setToken(token);
  34 + } catch (Exception e) {
  35 +
  36 + }
  37 + }
  38 + }
  39 +
  40 + @Override
  41 + public void destroy() {
  42 + }
  43 +}
0 44 \ No newline at end of file
... ...
jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/mqtoken/UserTokenContext.java 0 → 100644
  1 +package org.jeecg.common.config.mqtoken;
  2 +
  3 +
  4 +/**
  5 + * 用户token上下文
  6 + * @author zyf
  7 + */
  8 +public class UserTokenContext {
  9 +
  10 + private static ThreadLocal<String> userToken = new ThreadLocal<String>();
  11 +
  12 + public UserTokenContext() {
  13 + }
  14 +
  15 + public static String getToken(){
  16 + return userToken.get();
  17 + }
  18 +
  19 + public static void setToken(String token){
  20 + userToken.set(token);
  21 + }
  22 +}
... ...
jeecg-boot/jeecg-boot-starter/jeecg-boot-starter-rabbitmq/src/main/java/org/jeecg/boot/starter/rabbitmq/client/RabbitMqClient.java
... ... @@ -28,6 +28,7 @@ import java.text.SimpleDateFormat;
28 28 import java.util.Date;
29 29 import java.util.HashMap;
30 30 import java.util.Map;
  31 +import java.util.Properties;
31 32  
32 33 /**
33 34 * 消息队列客户端
... ... @@ -91,11 +92,16 @@ public class RabbitMqClient {
91 92 rabbitAdmin.declareExchange(directExchange);
92 93 if (ObjectUtil.isNotEmpty(queues)) {
93 94 for (String queueName : queues) {
94   - Queue queue = new Queue(queueName);
95   - addQueue(queue);
96   - Binding binding = BindingBuilder.bind(queue).to(directExchange).with(queueName);
97   - rabbitAdmin.declareBinding(binding);
98   - log.info("队列创建成功:" + queueName);
  95 + Properties result = rabbitAdmin.getQueueProperties(queueName);
  96 + if (ObjectUtil.isEmpty(result)) {
  97 + Queue queue = new Queue(queueName);
  98 + addQueue(queue);
  99 + Binding binding = BindingBuilder.bind(queue).to(directExchange).with(queueName);
  100 + rabbitAdmin.declareBinding(binding);
  101 + log.info("创建队列:" + queueName);
  102 + }else{
  103 + log.info("已有队列:" + queueName);
  104 + }
99 105 }
100 106 }
101 107 }
... ...
jeecg-boot/jeecg-boot-starter/jeecg-boot-starter-rabbitmq/src/main/java/org/jeecg/boot/starter/rabbitmq/config/RabbitMqConfig.java
1 1 package org.jeecg.boot.starter.rabbitmq.config;
2 2  
3 3  
  4 +import java.util.UUID;
  5 +
4 6 import org.jeecg.boot.starter.rabbitmq.event.JeecgRemoteApplicationEvent;
5   -import org.jeecg.boot.starter.rabbitmq.exchange.DelayExchangeBuilder;
  7 +import org.jeecg.common.config.mqtoken.TransmitUserTokenFilter;
6 8 import org.springframework.amqp.core.AcknowledgeMode;
7   -import org.springframework.amqp.core.CustomExchange;
8 9 import org.springframework.amqp.rabbit.connection.ConnectionFactory;
9 10 import org.springframework.amqp.rabbit.core.RabbitAdmin;
10 11 import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
... ... @@ -13,8 +14,6 @@ import org.springframework.cloud.bus.jackson.RemoteApplicationEventScan;
13 14 import org.springframework.context.annotation.Bean;
14 15 import org.springframework.context.annotation.Configuration;
15 16  
16   -import java.util.UUID;
17   -
18 17 /**
19 18 * 消息队列配置类
20 19 *
... ... @@ -33,7 +32,14 @@ public class RabbitMqConfig {
33 32 return rabbitAdmin;
34 33 }
35 34  
36   -
  35 + /**
  36 + * 注入获取token过滤器
  37 + * @return
  38 + */
  39 + @Bean
  40 + public TransmitUserTokenFilter transmitUserInfoFromHttpHeader(){
  41 + return new TransmitUserTokenFilter();
  42 + }
37 43  
38 44 @Bean
39 45 public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
... ...
jeecg-boot/jeecg-boot-starter/jeecg-boot-starter-rabbitmq/src/main/java/org/jeecg/boot/starter/rabbitmq/core/BaseRabbiMqHandler.java
... ... @@ -2,15 +2,24 @@ package org.jeecg.boot.starter.rabbitmq.core;
2 2  
3 3 import com.rabbitmq.client.Channel;
4 4 import lombok.extern.slf4j.Slf4j;
  5 +
5 6 import org.jeecg.boot.starter.rabbitmq.listenter.MqListener;
  7 +import org.jeecg.common.config.mqtoken.UserTokenContext;
6 8  
7 9 import java.io.IOException;
8 10  
  11 +/**
  12 + *
  13 + * @author zyf
  14 + */
9 15 @Slf4j
10 16 public class BaseRabbiMqHandler<T> {
11 17  
  18 + private String token= UserTokenContext.getToken();
  19 +
12 20 public void onMessage(T t, Long deliveryTag, Channel channel, MqListener mqListener) {
13 21 try {
  22 + UserTokenContext.setToken(token);
14 23 mqListener.handler(t, channel);
15 24 channel.basicAck(deliveryTag, false);
16 25 } catch (Exception e) {
... ...