JBPM 3 소스 코드 분석
JBPM 3 소스 코드 분석
작성 자: wocsok
JBPM 3 를 자주 사용 하 는 친구 들 은 아래 몇 줄 의 코드 에 대해 잘 알 고 있 을 지도 모른다.이 글 은 주로 JBPM 의 소스 코드 에 대해 간략하게 설명 하고 이 방법 들 에서 도대체 무엇 을 했 는 지 살 펴 보 자.
JbpmConfiguration configuration = JbpmConfiguration.getInstance();
JbpmContext jbpmContext = configuration.createJbpmContext();
InputStream is = new FileInputStream("test.par/processdefinition.xml");
ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is);
jbpmContext.deployProcessDefinition(processDefinition);
인용 하 다.
분석 하기 전에 여러분 은 먼저 몇 가지 개념 을 명 확 히 하 세 요.
1. JbpmConfiguration 은 말 그대로 JBPM 의 설정 입 니 다. 즉, 이 종 류 는 JBPM 의 설정 정 보 를 포함 합 니 다.
2. ObjectInfo。 JBPM 은 설정 파일 의 대상 을 Object Info 로 패키지 하여 통 일 된 작업 을 할 수 있 도록 합 니 다.
3. ObjectFactory。Object Info 의 공장 인 터 페 이 스 를 만 듭 니 다. 이것 은 하나의 실현 클래스 Object Factory Impl 만 있 습 니 다.
4. ObjectFactoryParser。XML 프로필 을 분석 하고 검사 (프로필 탭 의 이름, 지원 하 는 지 판단 합 니 다.), 그리고 Object Info 구현 클래스 를 만 들 때 Object Info 의 이름과 해당 하 는 대상 을 하나의 map 에 저장 합 니 다. 나중에 사용 할 때 이름 을 통 해 해당 하 는 대상 을 직접 추출 할 수 있 습 니 다.
본론 으로 돌아 가면 JbpmConfiguration configuration = JbpmConfiguration.getInstance();
안의 비밀.
public static JbpmConfiguration getInstance() {
return getInstance(null);
}
public static synchronized JbpmConfiguration getInstance(String resource) {
// jbpm.cfg.xml
if (resource == null) {
resource = "jbpm.cfg.xml";
}
// map
JbpmConfiguration instance = (JbpmConfiguration) instances
.get(resource);
// , , instances map
if (instance == null) {
// objectFactory
if (defaultObjectFactory != null) {
instance = new JbpmConfiguration(defaultObjectFactory);
} else {
try {
InputStream jbpmCfgXmlStream = ClassLoaderUtil
.getStream(resource);
//
ObjectFactory objectFactory = parseObjectFactory(jbpmCfgXmlStream);
// JbpmConfiguration
instance = new JbpmConfiguration(objectFactory);
} catch (RuntimeException e) {
throw new JbpmException(
"couldn't parse jbpm configuration from resource '"
+ resource + "'", e);
}
}
// , map 。
instances.put(resource, instance);
}
return instance;
}
대상 공장 을 구축 하 는 과정 을 살 펴 보 자.
protected static ObjectFactory parseObjectFactory(InputStream inputStream) {
//
ObjectFactoryParser objectFactoryParser = new ObjectFactoryParser();
// ObjectFactoryImpl
ObjectFactoryImpl objectFactoryImpl = new ObjectFactoryImpl();
// , , ObjectFactoryImpl。
objectFactoryParser.parseElementsFromResource(
"org/jbpm/default.jbpm.cfg.xml", objectFactoryImpl);
//
if (inputStream != null) {
objectFactoryParser.parseElementsStream(inputStream,
objectFactoryImpl);
}
return objectFactoryImpl;
}
object Factory Parser. parseElement s FromResource () 가 무엇 을 했 는 지 보 세 요.
public void parseElementsFromResource(String resource, ObjectFactoryImpl objectFactoryImpl) {
// XML
Element rootElement = XmlUtil.parseXmlResource(resource).getDocumentElement();
parseElements(rootElement, objectFactoryImpl);
}
XML 의 설정 정 보 를 Object Info 로 해석 하여 object Factory Impl 에 넣 습 니 다.
public void parseElements(Element element,
ObjectFactoryImpl objectFactoryImpl) {
List objectInfoElements = XmlUtil.elements(element);
for (int i = 0; i < objectInfoElements.size(); i++) {
Element objectInfoElement = (Element) objectInfoElements.get(i);
ObjectInfo objectInfo = parse(objectInfoElement);
objectFactoryImpl.addObjectInfo(objectInfo);
}
}
//
// objectInfo
public ObjectInfo parse(Element element) {
ObjectInfo objectInfo = null;
String elementTagName = element.getTagName().toLowerCase();
// : ObjectFactoryParser ,
// XML (java.lang.reflect.Constructor),
// key-value , mappings , Constructor 。
Constructor constructor = (Constructor) mappings.get(elementTagName);
if (constructor == null) {
throw new JbpmException(
"no ObjectInfo class specified for element '"
+ elementTagName + "'");
}
try {
// , objectInfo , objectInfo ,
// ObjectInfo KEY-VALUE
// MAP ,
// ( , MAP Construct)。
objectInfo = (ObjectInfo) constructor.newInstance(new Object[] {
element, this });
} catch (Exception e) {
throw new JbpmException("couldn't parse '" + elementTagName
+ "' into a '" + constructor.getDeclaringClass().getName()
+ "': " + XmlUtil.toString(element), e);
}
return objectInfo;
}
이로써 JbpmConfiguration 의 생 성 과정 이 완료 되 었 습 니 다.JbpmConfiguration 의 생 성 과정 은 jbpm. cfg. xml 프로필 과 default. jbpm. cfg. xml 프로필 입 니 다.
분석 한 다음 에 대응 하 는 Object Info 의 실현 클래스 로 봉 하여 object Factory Impl 에 넣 은 다음 에 만 든 JbpmConfiguration 대상 에 object Factory Impl 에 대한 인용 을 묻 었 습 니 다.
앞으로 저 는 어떤 Object Info 의 실현 류 를 만 들 든 이 대상 프로젝트 로 만 들 면 됩 니 다. (공장 대상 의 create () 방법 은 실제 적 으로 Object Info 에 대응 하 는 create 방법 을 호출 했 습 니 다.)
이제 default. jbpm. cfg. xml 에 무엇이 있 는 지 봅 시다.
//아직 많 습 니 다. 생략 합 니 다.
/ / 아직 많 습 니 다. 생략 합 니 다.
// StringInfo , 。
public StringInfo(Element stringElement, ObjectFactoryParser configParser) {
// map , ( :<long name="a" value="5000" singleton="true" />
singleton , true )
super(stringElement, configParser);
s = getValueString(stringElement);
}
protected String getValueString(Element element) {
String value = null;
if (element.hasAttribute("value")) {
value = element.getAttribute("value");
} else {
value = XmlUtil.getContentText(element);
}
return value;
}
//StringInfo value , StringInfo create();
public Object createObject(ObjectFactoryImpl objectFactory) {
// value ,
return s;
}
다음 글 은 복잡 한 JbpmContext 의 생 성 과정 을 살 펴 보 겠 습 니 다.
JbpmContext jbpmContext = configuration.createJbpmContext();
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
XML이란 무엇입니까?이것은 저장, 검색 및 공유할 수 있는 형식으로 데이터를 저장하는 강력한 방법입니다. 가장 중요한 것은 XML의 기본 형식이 표준화되어 있기 때문에 시스템이나 플랫폼 간에 로컬 또는 인터넷을 통해 XML을 공유하거나...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.