聊聊CanalInstanceGenerator

本文主要研究一下CanalInstanceGenerator


聊聊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

CanalInstance

generate

(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

BeanFactory

getBeanFactory

(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

CanalInstance

generate

(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

CanalInstance

generate

(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

BeanFactory

getBeanFactory

(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


分享到:


相關文章: