序
本文主要研究一下CanalInstanceGenerator
CanalInstanceGenerator
canal-1.1.4/instance/core/src/main/java/com/alibaba/otter/canal/instance/core/CanalInstanceGenerator.java
<code>public
interface
CanalInstanceGenerator
{ CanalInstance
generate
(String destination)
; }/<code>
- CanalInstanceGenerator定義了generate方法用於創建指定destination的CanalInstance
PlainCanalInstanceGenerator
canal-1.1.4/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/PlainCanalInstanceGenerator.java
<code>public
class
PlainCanalInstanceGenerator
implements
CanalInstanceGenerator
{ private
static
final
Logger logger = LoggerFactory.getLogger(SpringCanalInstanceGenerator.
class
);private
String springXml;private
PlainCanalConfigClient canalConfigClient;private
String defaultName ="instance"
;private
BeanFactory beanFactory;private
Properties canalConfig; public
PlainCanalInstanceGenerator
(Properties canalConfig)
{this
.canalConfig = canalConfig; } public
CanalInstancegenerate
(String destination)
{synchronized
(CanalInstanceGenerator.
class
) {try
{ PlainCanal canal = canalConfigClient.findInstance(destination,null
);if
(canal ==null
) {throw
new
CanalException("instance : "
+ destination +" config is not found"
); } Properties properties = canal.getProperties(); properties.putAll(canalConfig); com.alibaba.otter.canal.instance.spring.support.PropertyPlaceholderConfigurer.propertiesLocal.set(properties); System.setProperty("canal.instance.destination"
, destination);this
.beanFactory = getBeanFactory(springXml); String beanName = destination;if
(!beanFactory.containsBean(beanName)) { beanName = defaultName; } return
(CanalInstance) beanFactory.getBean(beanName); }catch
(Throwable e) { logger.error("generator instance failed."
, e);throw
new
CanalException(e); }finally
{ System.setProperty("canal.instance.destination"
,""
); } } } private
BeanFactorygetBeanFactory
(String springXml)
{ ApplicationContext applicationContext =new
ClassPathXmlApplicationContext(springXml);return
applicationContext; } public
void
setCanalConfigClient
(PlainCanalConfigClient canalConfigClient)
{this
.canalConfigClient = canalConfigClient; } public
void
setSpringXml
(String springXml)
{this
.springXml = springXml; } }/<code>
- PlainCanalInstanceGenerator實現了CanalInstanceGenerator接口,其generate方法通過canal.getProperties()設置相關屬性,然後再通過beanFactory.getBean(beanName)獲取CanalInstance
ManagerCanalInstanceGenerator
canal-1.1.4/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/ManagerCanalInstanceGenerator.java
<code>public
class
ManagerCanalInstanceGenerator
implements
CanalInstanceGenerator
{ private
CanalConfigClient canalConfigClient; public
CanalInstancegenerate
(String destination)
{ Canal canal = canalConfigClient.findCanal(destination); String filter = canalConfigClient.findFilter(destination);return
new
CanalInstanceWithManager(canal, filter); } public
void
setCanalConfigClient
(CanalConfigClient canalConfigClient)
{this
.canalConfigClient = canalConfigClient; } }/<code>
- ManagerCanalInstanceGenerator實現了CanalInstanceGenerator接口,其generate方法通過canalConfigClient獲取canal及filter,然後創建CanalInstanceWithManager
SpringCanalInstanceGenerator
canal-1.1.4/instance/spring/src/main/java/com/alibaba/otter/canal/instance/spring/SpringCanalInstanceGenerator.java
<code>public
class
SpringCanalInstanceGenerator
implements
CanalInstanceGenerator
{ private
static
final
Logger logger = LoggerFactory.getLogger(SpringCanalInstanceGenerator.
class
);private
String springXml;private
String defaultName ="instance"
;private
BeanFactory beanFactory; public
CanalInstancegenerate
(String destination)
{synchronized
(CanalInstanceGenerator.
class
) {try
{ System.setProperty("canal.instance.destination"
, destination);this
.beanFactory = getBeanFactory(springXml); String beanName = destination;if
(!beanFactory.containsBean(beanName)) { beanName = defaultName; } return
(CanalInstance) beanFactory.getBean(beanName); }catch
(Throwable e) { logger.error("generator instance failed."
, e);throw
new
CanalException(e); }finally
{ System.setProperty("canal.instance.destination"
,""
); } } } private
BeanFactorygetBeanFactory
(String springXml)
{ ApplicationContext applicationContext =new
ClassPathXmlApplicationContext(springXml);return
applicationContext; } public
void
setSpringXml
(String springXml)
{this
.springXml = springXml; } }/<code>
- SpringCanalInstanceGenerator實現了CanalInstanceGenerator接口,其generate方法通過beanFactory.getBean(beanName)獲取CanalInstance
小結
CanalInstanceGenerator定義了generate方法用於創建指定destination的CanalInstance;它有三個實現類分別是PlainCanalInstanceGenerator、ManagerCanalInstanceGenerator、SpringCanalInstanceGenerator
doc
- CanalInstanceGenerator
關鍵字: CanalInstanceGenerator springXml public