Skip to content

Commit

Permalink
✨ resolved (lets-blade#170)
Browse files Browse the repository at this point in the history
  • Loading branch information
hellokaton committed Dec 24, 2017
1 parent 150a9d4 commit 16d0e1e
Show file tree
Hide file tree
Showing 13 changed files with 144 additions and 29 deletions.
16 changes: 13 additions & 3 deletions src/main/java/com/blade/Blade.java
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,11 @@ public Environment environment() {
return environment;
}

public Blade environment(Environment environment) {
this.environment = environment;
return this;
}

/**
* Set to start the web server to monitor port, the default is 9000
*
Expand Down Expand Up @@ -550,14 +555,14 @@ public Blade appName(@NonNull String appName) {
}

/**
* Add a event listener
* Add a event watcher
* When the trigger event is executed eventListener
*
* @param eventType event type
* @param eventListener event listener
* @param eventListener event watcher
* @return blade
*/
public Blade event(@NonNull EventType eventType, @NonNull EventListener eventListener) {
public <T> Blade event(@NonNull EventType eventType, @NonNull EventListener<T> eventListener) {
eventManager.addEventListener(eventType, eventListener);
return this;
}
Expand Down Expand Up @@ -630,6 +635,11 @@ public Blade disableSession() {
return this;
}

public Blade watchEnvChange(boolean watchEnvChange){
this.environment.set(ENV_KEY_APP_WATCH_ENV, watchEnvChange);
return this;
}

/**
* Start blade application.
* <p>
Expand Down
16 changes: 10 additions & 6 deletions src/main/java/com/blade/event/Event.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,29 @@
package com.blade.event;

import com.blade.Blade;
import com.blade.mvc.WebContext;

/**
* Event
*
* @author biezhi
* @date 2017/9/18
*/
public class Event {
public class Event<T> {

public EventType eventType;
public Blade blade;
private T data;

public Event(EventType eventType) {
public Event(EventType eventType, T data) {
this.eventType = eventType;
this.data = data;
}

public Event(EventType eventType, Blade blade) {
this.eventType = eventType;
this.blade = blade;
public Blade blade(){
return WebContext.blade();
}

public T data(){
return this.data;
}
}
4 changes: 2 additions & 2 deletions src/main/java/com/blade/event/EventListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@
* @date 2017/9/18
*/
@FunctionalInterface
public interface EventListener {
public interface EventListener<T> {

/**
* Start event
*
* @param e Event instance
*/
void trigger(Event e);
void trigger(Event<T> e);

}
7 changes: 3 additions & 4 deletions src/main/java/com/blade/event/EventManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/
package com.blade.event;

import com.blade.Blade;
import com.blade.ioc.bean.OrderComparator;

import java.util.LinkedList;
Expand All @@ -39,14 +38,14 @@ public EventManager() {
this.listenerMap = Stream.of(EventType.values()).collect(Collectors.toMap(v -> v, v -> new LinkedList<>()));
}

public void addEventListener(EventType type, EventListener listener) {
public <T> void addEventListener(EventType type, EventListener<T> listener) {
listenerMap.get(type).add(listener);
}

public void fireEvent(EventType type, Blade blade) {
public <T> void fireEvent(EventType type, T data) {
listenerMap.get(type).stream()
.sorted(comparator)
.forEach(listener -> listener.trigger(new Event(type, blade)));
.forEach(listener -> listener.trigger(new Event<>(type, data)));
}

void fireEvent(EventType type) {
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/com/blade/event/EventType.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,6 @@ public enum EventType {
SERVER_STOPPED,
SESSION_CREATED,
SESSION_DESTROY,
SOURCE_CHANGED
SOURCE_CHANGED,
ENVIRONMENT_CHANGED
}
1 change: 1 addition & 0 deletions src/main/java/com/blade/mvc/Const.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public interface Const {
String ENV_KEY_DEV_MODE = "app.devMode";
String ENV_KEY_APP_NAME = "app.name";
String ENV_KEY_APP_THREAD_NAME = "app.thread-name";
String ENV_KEY_APP_WATCH_ENV = "app.watch-env";
String ENV_KEY_BANNER_PATH = "app.banner-path";
String ENV_KEY_GZIP_ENABLE = "http.gzip.enable";
String ENV_KEY_CORS_ENABLE = "http.cors.enable";
Expand Down
19 changes: 17 additions & 2 deletions src/main/java/com/blade/server/netty/NettyServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import com.blade.mvc.route.RouteMatcher;
import com.blade.mvc.ui.template.DefaultEngine;
import com.blade.server.Server;
import com.blade.watcher.EnvironmentWatcher;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelOption;
Expand Down Expand Up @@ -84,6 +85,8 @@ public void start(Blade blade, String[] args) throws Exception {

this.shutdownHook();

this.watchEnv();

this.startServer(initStart);

}
Expand Down Expand Up @@ -115,7 +118,6 @@ private void initIoc() {
}

this.processors.stream().sorted(new OrderComparator<>()).forEach(b -> b.processor(blade));

}

private void startServer(long startTime) throws Exception {
Expand Down Expand Up @@ -213,6 +215,17 @@ private boolean isExceptionHandler(Class<?> clazz) {
ReflectKit.hasInterface(clazz, ExceptionHandler.class) || clazz.getSuperclass().equals(DefaultExceptionHandler.class)));
}

private void watchEnv() {
boolean watchEnv = environment.getBoolean(ENV_KEY_APP_WATCH_ENV, true);
log.info("⬢ Watched environment: {}", watchEnv);

if (watchEnv) {
Thread t = new Thread(new EnvironmentWatcher());
t.setName("watch@thread");
t.start();
}
}

private void loadConfig(String[] args) {

String bootConf = blade.environment().get(ENV_KEY_BOOT_CONF, "classpath:app.properties");
Expand Down Expand Up @@ -278,7 +291,9 @@ private void initConfig() {
}

private void shutdownHook() {
Runtime.getRuntime().addShutdownHook(new Thread(this::stop));
Thread shutdownThread = new Thread(this::stop);
shutdownThread.setName("shutdown@thread");
Runtime.getRuntime().addShutdownHook(shutdownThread);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import java.io.RandomAccessFile;

/**
* File progressive future listener
* File progressive future watcher
*
* @author biezhi
*/
Expand Down
68 changes: 68 additions & 0 deletions src/main/java/com/blade/watcher/EnvironmentWatcher.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.blade.watcher;

import com.blade.Environment;
import com.blade.event.EventType;
import com.blade.mvc.Const;
import com.blade.mvc.WebContext;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.nio.file.*;

/**
* Environment watcher
*
* @author biezhi
* @date 2017/12/24
*/
@Slf4j
public class EnvironmentWatcher implements Runnable {

@Override
public void run() {
final Path path = Paths.get(Const.CLASSPATH);

try (WatchService watchService = FileSystems.getDefault().newWatchService()) {

path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);

// start an infinite loop
while (true) {
final WatchKey key = watchService.take();
for (WatchEvent<?> watchEvent : key.pollEvents()) {
final WatchEvent.Kind<?> kind = watchEvent.kind();
if (kind == StandardWatchEventKinds.OVERFLOW) {
continue;
}
// get the filename for the event
final WatchEvent<Path> watchEventPath = (WatchEvent<Path>) watchEvent;
final String filename = watchEventPath.context().toString();
// print it out
if (log.isDebugEnabled()) {
log.debug("⬢ {} -> {}", kind, filename);
}
if (kind == StandardWatchEventKinds.ENTRY_DELETE &&
filename.startsWith(".app") && filename.endsWith(".properties.swp")) {
// reload env
log.info("⬢ Reload environment");

Environment environment = Environment.of("classpath:" + filename.substring(1, filename.length() - 4));
WebContext.blade().environment(environment);
// notify
WebContext.blade().eventManager().fireEvent(EventType.ENVIRONMENT_CHANGED, environment);
}
}
// reset the keyf
boolean valid = key.reset();
// exit loop if the key is not valid (if the directory was
// deleted, for
if (!valid) {
break;
}
}
} catch (IOException | InterruptedException ex) {
log.error("Environment watch error", ex);
}
}

}
2 changes: 1 addition & 1 deletion src/test/java/com/blade/BladeTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public void testRegister() {
start(
app.register(new BladeBeanDefineType())
.event(EventType.SERVER_STARTED, e -> {
Object bladeBeanDefineType = e.blade.getBean(BladeBeanDefineType.class);
Object bladeBeanDefineType = e.blade().getBean(BladeBeanDefineType.class);
Assert.assertNotNull(bladeBeanDefineType);
})
);
Expand Down
11 changes: 2 additions & 9 deletions src/test/java/com/blade/event/EventTest.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.blade.event;

import com.blade.Blade;
import org.junit.Assert;
import org.junit.Test;

Expand All @@ -10,17 +9,11 @@
*/
public class EventTest {

@Test
public void testEvent(){
Event event = new Event(EventType.SERVER_STARTED);
Assert.assertEquals("SERVER_STARTED", event.eventType.name());
}

@Test
public void testEventAndBlade(){
Event event = new Event(EventType.SERVER_STARTED, Blade.me());
Event event = new Event(EventType.SERVER_STARTED, "hello");
Assert.assertEquals("SERVER_STARTED", event.eventType.name());
Assert.assertNotNull(event.blade);
Assert.assertNotNull(event.data());
}

}
22 changes: 22 additions & 0 deletions src/test/java/netty_hello/ConfigChanged.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package netty_hello;

import com.blade.Environment;
import com.blade.event.Event;
import com.blade.event.EventListener;
import com.blade.ioc.annotation.Bean;

/**
* @author biezhi
* @date 2017/12/24
*/
@Bean
public class ConfigChanged implements EventListener<Environment> {

@Override
public void trigger(Event<Environment> e) {
Environment environment = e.data();
System.out.println("EventListener::ConfigChanged");
System.out.println(environment.toMap());
}

}
2 changes: 2 additions & 0 deletions src/test/java/netty_hello/Hello.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package netty_hello;

import com.blade.Blade;
import com.blade.event.EventType;

/**
* @author biezhi
Expand All @@ -13,6 +14,7 @@ public static void main(String[] args) {
// .devMode(false)
// .environment(Const.ENV_KEY_NETTY_WORKERS, Runtime.getRuntime().availableProcessors())
.get("/hello", ((request, response) -> response.text("Hello World.")))
.event(EventType.ENVIRONMENT_CHANGED, new ConfigChanged())
.start(Hello.class, args);
}
}

0 comments on commit 16d0e1e

Please sign in to comment.