转载于 基于ZooKeeper和Thrift构建动态RPC调用
一、基本功能
实现服务端向ZooKeeper集群注册自己提供的服务,并且把自己的IP地址和服务端口创建到具体的服务目录下。客户端向ZooKeeper集群监听自己关注的RPC服务(例如:sayHello和天气服务), 监听服务目录下的IP地址列表变化。
对于spring boot2的有关用法,目前还不是很熟悉。在尝试将此项目,转为spring boot过程中,遇到的问题:
- 有关自动注入listener
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.addListeners(new StartWeatherWithAPP());
application.run(args);
}
}
我需要将implements ApplicationListener
的StartWeatherWithAPP,加到application中。刚开始想的是在Application
中加上Autowired
让StartWeatherWithAPP自动注入进去,同时main
函数是static
的,
@SpringBootApplication
public class Application {
@Autowired
private static StartWeatherWithAPP listener;
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.addListeners(listener);
application.run(args);
}
}
但是后来发现:这个listener
始终是null的。Spring doesn’t allow to inject value into static variables, for example:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class GlobalValue {
@Value("${mongodb.db}")
public static String DATABASE;
}
property can’t be static (as opposed to the code above), or the @Value annotation won’t work with it.
To fix it, create a “none static setter” to assign the injected value for the static variable. For example :
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class GlobalValue {
public static String DATABASE;
@Value("${mongodb.db}")
public void setDatabase(String db) {
DATABASE = db;
}
}
后来发现,根本无须这样操作,直接在StartWeatherWithAPP
上加上@Component
即可。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.run(args);
}
}
@Component
public class StartWeatherWithAPP implements ApplicationListener {
......
}
2.对于spring boot中,获取配置文件中的值,不能用new的形式去创建类,这样的方法创建类的话,那么@value
的属性值将会是null。
不能用new工具类的方式,应该是用容器注册(@Autowried)的方式使用此工具类,就能得到配置文件里的值
3.Client session timed out, have not heard from server in, closing socket connection and attempting reconnect
有时候,server端的地址,在zk中找不到,原因没有找到。下次遇到这种情况,可以从zk的日志着手看看。另外,在其他地方看到有人说,如果是
参考地址:
1.https://www.mkyong.com/spring/spring-inject-a-value-into-static-variables/