yangyoupeng

pom去除alpaca-config-zookeeper;

添加ZhaoLogger模块
......@@ -13,10 +13,12 @@
<name>microservice-framework-core</name>
<dependencies>
<!-- 去掉alpaca-config-zookeeper
<dependency>
<groupId>com.zhaoonline</groupId>
<artifactId>alpaca-config-zookeeper</artifactId>
</dependency>
-->
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo</artifactId>
......
......@@ -21,7 +21,7 @@ import java.util.UUID;
public class RequestUtils {
public static String nextUniqueRequestID(String prefix){
return prefix+nextUniqueRequestID();
return prefix+"-"+nextUniqueRequestID();
}
public static String nextUniqueRequestID(){
UUID randomUUID=UUID.randomUUID();
......
......@@ -14,12 +14,12 @@ import java.util.concurrent.CountDownLatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import com.zhaoonline.alpaca.config.bootstrap.AlpacaApplication;
import com.zhaoonline.microservice.framework.config.ServiceConfiguration;
import com.zhaoonline.microservice.framework.config.ServiceConstants;
......@@ -52,7 +52,10 @@ public class ServiceApplication {
boolean webEnvironment = ServiceConfiguration.getBoolean(ServiceConstants.APPLICATION_TYPE_WEB, false);
SpringApplicationBuilder builder= new SpringApplicationBuilder().sources(ServiceApplication.class).bannerMode(Banner.Mode.OFF).web(webEnvironment);
builder.registerShutdownHook(true);
ConfigurableApplicationContext context = AlpacaApplication.run(builder, args);
// ConfigurableApplicationContext context = AlpacaApplication.run(builder, args);
ConfigurableApplicationContext context = SpringApplication.run(builder, args);
context.close();
System.exit(0);
}
......@@ -64,8 +67,10 @@ public class ServiceApplication {
SpringApplicationBuilder builder= new SpringApplicationBuilder().sources(ServiceApplication.class).bannerMode(Banner.Mode.OFF).web(webEnvironment);
builder.registerShutdownHook(true);
ConfigurableApplicationContext context = AlpacaApplication.run(builder, args);
//ConfigurableApplicationContext context = AlpacaApplication.run(builder, args);
ConfigurableApplicationContext context = SpringApplication.run(builder, args);
CountDownLatch closeLatch = context.getBean(CountDownLatch.class);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
......
package com.zhaoonline.microservice.framework.log;
import org.slf4j.Logger;
import com.zhaoonline.microservice.framework.support.ThreadContext;
public class ZhaoLogger {
private Logger logger ;
public void setLogger(Logger logger) {
this.logger=logger;
}
public void info(Object msg){
ThreadContext threadContext=ThreadContext.getContext();
LogEvent event=buildEvent(threadContext);
logger.info(ZhaoLoggerTemplate.getTemplate(),event.getRequestID(),event.getMethod(),msg,threadContext);
}
public void error(Object msg ){
ThreadContext threadContext=ThreadContext.getContext();
LogEvent event=buildEvent(threadContext);
logger.error(ZhaoLoggerTemplate.getTemplate(),event.getRequestID(),event.getMethod(),msg,threadContext);
}
public void warn(Object msg ){
ThreadContext threadContext=ThreadContext.getContext();
LogEvent event=buildEvent(threadContext);
logger.warn(ZhaoLoggerTemplate.getTemplate(),event.getRequestID(),event.getMethod(),msg,threadContext);
}
public void debug(Object msg ){
ThreadContext threadContext=ThreadContext.getContext();
LogEvent event=buildEvent(threadContext);
logger.debug(ZhaoLoggerTemplate.getTemplate(),event.getRequestID(),event.getMethod(),msg,threadContext);
}
public void trace(Object msg ){
ThreadContext threadContext=ThreadContext.getContext();
LogEvent event=buildEvent(threadContext);
logger.trace(ZhaoLoggerTemplate.getTemplate(),event.getRequestID(),event.getMethod(),msg,threadContext);
}
private LogEvent buildEvent(ThreadContext threadContext) {
String requestID=threadContext.getRequestID();
StackTraceElement[] traceElements=Thread.currentThread().getStackTrace();
LogEvent event=new LogEvent();
//the invoke method of log method[info,warn,error,trace,debug]
if(traceElements.length >4){
StackTraceElement traceElement=traceElements[3];
event.setMethod(traceElement.getMethodName());
}
event.setRequestID(requestID);
return event;
}
public boolean isDebugEnabled(){
return logger.isDebugEnabled();
}
public boolean isErrorEnabled(){
return logger.isErrorEnabled();
}
public boolean isWarnEnabled(){
return logger.isWarnEnabled();
}
public boolean isTraceEnabled(){
return logger.isTraceEnabled();
}
private static class LogEvent{
private String requestID;
private String method;
public String getRequestID() {
return requestID;
}
public void setRequestID(String requestID) {
this.requestID = requestID;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
}
}
package com.zhaoonline.microservice.framework.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ZhaoLoggerFactory {
public static ZhaoLogger getLogger(String name) {
ZhaoLogger zhaologger=new ZhaoLogger();
Logger logger= LoggerFactory.getLogger(name);
zhaologger.setLogger(logger);
return zhaologger;
}
public static ZhaoLogger getLogger(Class<?> clazz) {
ZhaoLogger zhaologger=new ZhaoLogger();
Logger logger= LoggerFactory.getLogger(clazz);
zhaologger.setLogger(logger);
return zhaologger;
}
}
package com.zhaoonline.microservice.framework.log;
public class ZhaoLoggerTemplate {
//该模板的函数是RequestID,Method,Message,AttacheInfo
public static String DEFAULT_TEMPLATE="[{}],[{}],[{}],[{}]";
public static String getTemplate() {
return DEFAULT_TEMPLATE;
}
}
......@@ -9,25 +9,30 @@
*/
package com.zhaoonline.microservice.framework.support;
import java.util.concurrent.ConcurrentHashMap;
/**
* class name:ThreadContext <BR>
* class description: please write your description <BR>
* class description: 与线程绑定的内容 <BR>
* Remark: <BR>
* @version 1.00 2016年8月10日
* @author zhaoonline)yangyoupeng
*/
public class ThreadContext {
public class ThreadContext extends ConcurrentHashMap<String, Object>{
/**
* serialVersionUID:TODO
*/
private static final long serialVersionUID = -7551338871443500983L;
public static final ThreadLocal<ThreadContext> local=new ThreadLocal<ThreadContext>(){
@Override
protected ThreadContext initialValue() {
return new ThreadContext();
}
};
private String requestID;
/**
* Method name: getRequestID <BR>
......@@ -65,4 +70,39 @@ public class ThreadContext {
}
/**
* Convenience method to return a boolean value for a given key
*
* @param key
* @param defaultResponse
* @return true or false depending what was set. default defaultResponse
*/
public boolean getBoolean(String key, boolean defaultResponse) {
Boolean b = (Boolean) get(key);
if (b != null) {
return b.booleanValue();
}
return defaultResponse;
}
/**
* sets a key value to Boolen.TRUE
*
* @param key
*/
public void set(String key) {
put(key, Boolean.TRUE);
}
/**
* puts the key, value into the map. a null value will remove the key from the map
*
* @param key
* @param value
*/
public void set(String key, Object value) {
if (value != null) put(key, value);
else remove(key);
}
}
......
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--
<context:component-scan base-package="com.zhaoonline.message.queue" />
-->
<bean class="com.zhaoonline.microservice.framework.annotation.InjectRequestIDAdvisor">
</bean>
<bean class="com.zhaoonline.microservice.framework.annotation.InjectRequestIDMethodInterceptor">
</bean>
<aop:aspectj-autoproxy/>
</beans>
\ No newline at end of file
package com.zhaoonline.microservice.framework.log;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.zhaoonline.microservice.framework.annotation.InjectRequestID;
import com.zhaoonline.microservice.framework.testannotation.InjectOpDemo;
@RunWith(SpringJUnit4ClassRunner.class)
@EnableAutoConfiguration
@Configuration
@ContextConfiguration("classpath:spring-microservice-core.xml")
@ComponentScan(basePackageClasses={InjectRequestID.class,TestZhaoLogger.class,InjectOpDemo.class})
public class TestZhaoLogger {
@Bean
public static InjectOpDemo demo(){
return new InjectOpDemo();
}
InjectOpDemo demoRef=null;
@Before
public void prepare(){
SpringApplication app = new SpringApplication(TestZhaoLogger.class);
app.setRegisterShutdownHook(false);
app.setWebEnvironment(false);
ConfigurableApplicationContext context= app.run("aa","aaa");
demoRef= (InjectOpDemo) context.getBean("demo");
}
/**
* Method name: testZhaoLogger <BR>
* Description: 能答应loginfo,以及RequestID <BR>
* Remark: <BR> void<BR>
*/
@Test
public void testZhaoLogger(){
demoRef.demo();
}
}
......@@ -11,6 +11,9 @@ package com.zhaoonline.microservice.framework.testannotation;
import org.springframework.beans.factory.annotation.Autowired;
import com.zhaoonline.microservice.framework.annotation.InjectRequestID;
import com.zhaoonline.microservice.framework.log.TestZhaoLogger;
import com.zhaoonline.microservice.framework.log.ZhaoLogger;
import com.zhaoonline.microservice.framework.log.ZhaoLoggerFactory;
import com.zhaoonline.microservice.framework.support.ThreadContext;
/**
......@@ -25,10 +28,11 @@ public class InjectOpDemo {
private String requestID;
@Autowired
private InjectOpDemo demo2;
ZhaoLogger logger=ZhaoLoggerFactory.getLogger(InjectOpDemo.class);
@InjectRequestID(prefix=prefix)
public String demo(){
logger.info("this is a test");
String request2=ThreadContext.getContext().getRequestID();
return request2;
}
......