当前位置:Gxlcms > 数据库问题 > springcloudBus 2.x 事件追踪

springcloudBus 2.x 事件追踪

时间:2021-07-01 10:21:17 帮助过:2人阅读

  2. 建立自己的TraceRepository和Trace

package com.kevin.config.client;

import java.util.List;
import java.util.Map;

public interface CustomeTraceRepository {
    List<CustomTrace> findAll();

    void add(Map<String, Object> arg0);
}
package com.kevin.config.client;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class CustomTraceRepositoryImpl implements CustomeTraceRepository {
    private int capacity = 100;
    private boolean reverse = true;
    private final List<CustomTrace> traces = new LinkedList();

    public void setReverse(boolean reverse) {
        List arg1 = this.traces;
        synchronized (this.traces) {
            this.reverse = reverse;
        }
    }

    public void setCapacity(int capacity) {
        List arg1 = this.traces;
        synchronized (this.traces) {
            this.capacity = capacity;
        }
    }

    public List<CustomTrace> findAll() {
        List arg0 = this.traces;
        System.out.println(this.traces.size());
        synchronized (this.traces) {
            return Collections.unmodifiableList(new ArrayList(this.traces));
        }
    }

    public void add(Map<String, Object> map) {
        CustomTrace trace = new CustomTrace(new Date(), map);
        List arg2 = this.traces;
        synchronized (this.traces) {
            while (this.traces.size() >= this.capacity) {
                this.traces.remove(this.reverse ? this.capacity - 1 : 0);
            }

            if (this.reverse) {
                this.traces.add(0, trace);
            } else {
                this.traces.add(trace);
            }

        }
    }
}

  

package com.kevin.config.client;

import java.util.Date;
import java.util.Map;

import org.springframework.util.Assert;

public final class CustomTrace {
    private final Date timestamp;
    private final Map<String, Object> info;

    public CustomTrace(Date timestamp, Map<String, Object> info) {
        Assert.notNull(timestamp, "Timestamp must not be null");
        Assert.notNull(info, "Info must not be null");
        this.timestamp = timestamp;
        this.info = info;
    }

    public Date getTimestamp() {
        return this.timestamp;
    }

    public Map<String, Object> getInfo() {
        return this.info;
    }
}

 3. 建立自己的监听器,监听SentApplicationEvent和AckRemoteApplicationEvent

package com.kevin.config.client;

import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.cloud.bus.event.AckRemoteApplicationEvent;
import org.springframework.cloud.bus.event.SentApplicationEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class TraceListener {
    private static Log log = LogFactory.getLog(TraceListener.class);
    private CustomeTraceRepository repository;

    public TraceListener(CustomeTraceRepository repository) {
        this.repository = repository;
    }

    @EventListener
    public void onAck(AckRemoteApplicationEvent event) {
        this.getReceivedTrace(event);
    }

    @EventListener
    public void onSend(SentApplicationEvent event) {
        this.getSentTrace(event);
    }

    protected Map<String, Object> getSentTrace(SentApplicationEvent event) {
        LinkedHashMap map = new LinkedHashMap();
        map.put("signal", "spring.cloud.bus.sent");
        map.put("type", event.getType().getSimpleName());
        map.put("id", event.getId());
        map.put("origin", event.getOriginService());
        map.put("destination", event.getDestinationService());
        if (log.isDebugEnabled()) {
            log.debug(map);
        }
        this.repository.add(map);
        return map;
    }

    protected Map<String, Object> getReceivedTrace(AckRemoteApplicationEvent event) {
        LinkedHashMap map = new LinkedHashMap();
        map.put("signal", "spring.cloud.bus.ack");
        map.put("event", event.getEvent().getSimpleName());
        map.put("id", event.getAckId());
        map.put("origin", event.getOriginService());
        map.put("destination", event.getAckDestinationService());
        if (log.isDebugEnabled()) {
            log.debug(map);
        }
        this.repository.add(map);
        return map;
    }
}

 4. 让spring管理建立的repository

 @Bean
    public CustomTraceRepositoryImpl customeTraceRepository() {
        return new CustomTraceRepositoryImpl();
    }

5 .最后暴露一个接口从repository获取数据

@RequestMapping(value = "/trace")
    public List<CustomTrace> trace(HttpServletRequest request) throws IOException {
        return customeTraceRepository().findAll();
    }

至此,就可以通过这个接口获取事件追踪记录,本例子中repository默认存储100条,如果超出就会覆盖首尾的记录,如果有其他特殊需求可以自行实现。

注意:在建立自己的repository和trace的时候类的名字最好不要和spring里面的一样,否则会报一些莫名的错误,具体原因没有细究,反正我是改了名字就可以。

springcloudBus 2.x 事件追踪

标签:work   size   receive   set   text   str   request   value   ring   

人气教程排行