1. 배경
오늘날의 웹사이트에는 WAP, SMS, EMAIL, 기존 웹, 소켓 등 접속 채널이 점점 더 많아지고 기술도 점점 발전하고 있습니다. 데이터베이스와 LDAP까지 포함한다면 접속이 불가능할 경우 따라서 디자인에서 확장해야 하는 공간은 새로운 채널을 추가할 때 더 이상 코드 수정이나 코드 변경이 필요하지 않도록 매우 좋아야 합니다. 그런데 가능하지 않을 것 같은데, 이 다중 채널 액세스 프레임워크의 완벽함을 더 잘 해결할 수 있는 방법은 없을까요
?
[그림 1]
그림 1과 같이 기존 액세스를 모두 사용하면 디자이너는 당황하게 됩니다. 사람들을 모으는 것이라면 이러한 프로그램은 어떤 방식으로든 작성될 수 있으며 확실히 구현될 수 있습니다. 하지만 유지 관리가 더 어려울 것입니다. 질문으로 돌아가서 어떻게 하면 보다 완벽한 구현을 달성할 수 있습니까?
[그림 2]
그림 2는 8개의 발톱이 있는 문어의 모습을 하고 있으며, 문어의 다리는 각각 모든 액세스 채널에 연결되어 있습니다. 이 모든 채널을 연결하는 핵심은 문어의 머리인 XMLRouter입니다. 모든 채널과 통신하고 데이터 라우팅의 이점과 시스템 아키텍처의 확장성 및 유연성 향상을 실현합니다. 유연하고 표준화된 언어인 XML을 데이터 전송 매체로 사용하지 않으면 라우터의 작업 부하도 기하급수적으로 증가하기 때문에 XMLRouter라고 합니다.
3. 아이디어와 패턴
XMLRouter의 원래 아이디어는 컴퓨터의 마더보드와 <
> 빌더 패턴에서는 컴퓨터 마더보드의 PCI 슬롯이 PCI 사양을 정의합니다. 생산하는 카드가 PCI 표준을 충족하는 한 마더보드에 삽입하면 작동할 수 있습니다.
Builder Pattern은 복잡한 구성을 분리하여 단계별로 구현하는 것을 제안하며, XMLRouter는 이러한 복잡한 채널을
분리하여 하나씩 수행합니다.
여기서는 서비스라고 합니다. 프로그램이 서비스 사양을 준수하는 한 라우터에 액세스하고 데이터를 라우팅할 수 있습니다.
공장 모드 및 복합 모드
XMLRouter는 실제 설계에서 라우터를 사용하여 생성됩니다. RouterFactory는 사용 시 큐에 배치됩니다. 전송 데이터, 수신 데이터 및 반환 데이터는 모두 큐에서 해당 라우터에서 호출되며 복합 모드가 적용
됩니다
. 라우터의 경우 사용은 두 부분으로 나누어집니다. 첫 번째는 다음과 같은 라우터의 구성입니다.
다음은 인용문입니다: <?xml 버전="1.0" ?> <서비스> <!-- 데이터베이스 서비스 --> <서비스 이름="데이터베이스" 유형="데이터베이스" 클래스="com.web.service.DBService"> <커넥터 드라이버="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://192.168.0.179:1433" 사용자="테스트" passwd="테스트" /> </service> <!-- 웹 서비스--> <서비스 이름="웹" 유형="웹" 클래스="com.web.service.WebService" > <커넥터 /> </service> … </services> |
이것은 라우터의 구성 파일입니다. 서비스 노드에는 커넥터 하위 노드가 포함되어 있습니다. 데이터베이스의 경우 url, user, passwd, 드라이버 등과 같은 속성이 포함되며, 소켓인 경우에는 port 및 maxthread와 같은 속성이 포함됩니다. 속성 값은 사용자 정의에 따라 구성할 수 있습니다.
또 다른 유형의 XML 파일은 모든 서비스에서 데이터를 전송하는 데 사용되는 XML 트랜잭션 데이터 파일입니다.
각 서비스에는 자체 XML 파일(예: webtrans.xml)이 포함되어 있습니다.
다음은 인용문입니다: <?xml 버전="1.0" ?> <거래> <trans name="addDoc" service="database" method="insert"> <속성 이름="createtime" type="timestamp"/> <속성 이름="creatorid" type="long"/> <속성 이름="doctypeid" 유형="int"/> <속성 이름="docstatusid" type="int"/> </trans> </transaction> |
해당 dbtrans.xml 형식은 다음과 같습니다.
다음은 인용문입니다: <trans name="addDoc" table="TDOC_DOCS" 메서드="삽입"> <기본 키 이름="docid" /> <세트> <속성 이름="createtime" type="timestamp"/> <속성 이름="creatorid" type="long"/> <속성 이름="doctypeid" 유형="int"/> <속성 이름="docstatusid" type="int"/> </set> </trans> |
나머지 XML은 이러한 규칙에 따라 사용자 정의할 수 있습니다
RouterFactory의
기술적 구현
.다음은 인용문입니다: 패키지 com.web.router; import com.web.platform.Exception.RouterException; import java.util.java/util/Hashtable.java.html" target="_blank">Hashtable; |
다음은 참조 조각입니다. /** * 라우터에 의해 생성되고 삭제되는 클래스 */ 공개 클래스 RouterFactory { /** * 라우터에 의해 저장된 트리 프론트 */ 개인 정적 java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null; /** * 라우터에 의해 저장된 트리 백 */ 개인 정적 java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null; /** * 라우터에 의해 저장된 트리 */ 개인 정적 java/util/Hashtable.java.html" target="_blank">Hashtable QueueRouter = null; /** * 반환된 XMLRouter */ 공개 정적 XMLRouter 인스턴스 = null; /** *라우터의 정의 */ 공개 정적 RouterDefine routerdefine = null; /** * 라우터 ID 번호 */ 공개 정적 긴 RouteIndex = 0; /** * @로즈이드 3F169C21027C */ 공개 라우터팩토리() { } /** * 해시테이블 및 벡터 초기화 */ public static void initFactory()에서 java/lang/Exception.java.html" target="_blank">예외가 발생합니다. { QueuePairFront = new java/util/Hashtable.java.html" target="_blank">Hashtable(); QueuePairBack = 새로운 java/util/Hashtable.java.html" target="_blank">Hashtable(); QueueRouter = 새로운 java/util/Hashtable.java.html" target="_blank">Hashtable(); initRouteDefine(); } /** * 경로 설정 초기화 * */ private static void initRouteDefine()에서 java/lang/Exception.java.html" target="_blank">예외가 발생합니다. { if(라우터 정의 == null) routerdefine = 새로운 RouterDefine(); routerdefine.loadRouterDef(); } /** * 반환 인스턴스 * @return com.web.router.XMLRouter */ 공개 정적 XMLRouter getInstance(긴 인덱스)에서 RouterException이 발생합니다. { return (XMLRouter)QueueRouter.get(new java/lang/Long.java.html" target="_blank">Long(index)); } /** * XMLRouter의 인스턴스 생성 * @return com.web.router.XMLRouter * @roseuid 3F1618A103BC */ 공개 정적 XMLRouter popInstance()에서 RouterException이 발생합니다. { 경로 인덱스++; 인스턴스 = new XMLRouter(routeIndex); setDefine(인스턴스); QueueRouter.put(new java/lang/Long.java.html" target="_blank">Long(routeIndex), 인스턴스); 반환 인스턴스; } /** * 해시테이블, 벡터 등 지우기 * @roseuid 3F1618B203C1 */ private static void freeResource()에서 java/lang/Exception.java.html" target="_blank">예외가 발생합니다. { QueuePairFront.clear(); QueuePairBack.clear(); QueueRouter.clear(); QueuePairFront = QueuePairBack = QueueRouter = null; } /** * 인스턴스 지우기 * @param 인스턴스 ID * @throwsException */ 공용 정적 무효 제거 인스턴스(XMLRouter 인스턴스)에서 java/lang/Exception.java.html" target="_blank">예외가 발생합니다. { 인스턴스.클리어(); QueueRouter.remove( new java/lang/Long.java.html" target="_blank">Long(instance.getIndex() ) ) ; } /** * 메소드는 Null입니다. * @return 부울 */ 공개 정적 부울 isNull() { … 거짓을 반환; } } |
다음은 인용문입니다: 패키지 com.web.router; import com.web.platform.Exception.RouterException; import com.web.common.*; import java.util.*; import java.lang.reflect.java/lang/reflect/Method.java.html" target="_blank">메서드; import java.lang.reflect.java/lang/reflect/Constructor.java.html" target="_blank">생성자; /** * @author 켈리 * @버전 0.0.1 * 플랫폼의 키, 라우팅 클래스, 각 라우터는 RouterFactory에서 읽습니다. * Router에 저장되는 tree front, back, RouteIndex는 라우팅용입니다. * 적용된 객체는 추후 삭제될 수 있습니다. * 라우터는 동기 및 비동기 기능을 구현할 수 있습니다. */ 공개 클래스 XMLRouter { /** * 라우터에 의해 저장된 트리 프론트 */ 개인 정적 java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null; /** * 라우터에 의해 저장된 트리백 */ 개인 정적 java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null; /** * 이 라우터의 인덱스 번호 */ 개인 장거리 RouteIndex = 0; /** * 라우터 설정 */ 개인 RouterDefine 정의 = null; /** * 경로의 시작점을 결정하는 데 사용됩니다 */ private java/lang/String.java.html" target="_blank">String action = ""; /** *이 변수는 Routeto 메소드에서 새 클래스를 적용하는 데에만 사용됩니다. */ private java/lang/String.java.html" target="_blank">문자열 클래스 이름 = ""; /** */ 공개 XMLRouter(긴 인덱스) { 경로 인덱스 = 인덱스; } /** * 라우팅 * @throws 예외 * @roseuid 3F1616BD0186 */ 공개 무효 라우팅(Env env)에서 RouterException, java/lang/Exception.java.html" target="_blank">예외가 발생합니다. { /*시작점인 경우*/ if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTETO ) ) { … } /*귀환 지점인 경우*/ else if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTEBACK ) ) { … } /*그렇지 않으면 오류입니다*/ 또 다른 throw new RouterException("라우터 작업 설정 오류입니다."); } /** * 이 라우터의 ID 번호를 읽으십시오. * @return 긴 */ 공개 긴 getIndex() { 경로 인덱스를 반환합니다. } /** * 모든 개체를 지웁니다. * @throws RouterException */ public voidclear()에서 RouterException이 발생합니다. { QueuePairFront.remove(new java/lang/Long.java.html" target="_blank">Long(routeIndex)); QueuePairBack.remove(new java/lang/Long.java.html" target="_blank">Long(routeIndex)); /*시스템 재활용*/ java/lang/System.java.html" target="_blank">System.runFinalization(); } /** * 이 라우터의 설정을 지정합니다. * @param 데프 * @throws RouterException */ public void setDefine(RouterDefine def)에서 RouterException이 발생합니다. { 정의 = 정의; } /** * 액션 값 설정 * @param actionName * @throws RouterException */ 공개 무효 setAction( java/lang/String.java.html" target="_blank">문자열 actionName) { 액션 = 액션이름; } } |
서비스 클래스
다음은 인용문입니다: 패키지 com.web.common; import com.web.platform.Exception.RouterException; /** * 서비스의 상위 클래스, 추상 */ 공개 추상 클래스 RouteService { /** */ 공개 경로 서비스() { } /** * RouteTo 메소드는 트랜잭션의 시작점입니다. * @param 환경 * @throws RouterException */ 공개 추상 무효 경로(Env env)가 RouterException을 발생시킵니다. /** *routeBack, 트랜잭션의 종료 지점, * @param 환경 * @throws RouterException */ 공개 추상 무효 경로백(Env env)이 RouterException을 발생시킵니다. /** * Routeaccept 메소드는 트랜잭션의 수신 지점이자 Routeto의 수신 기능입니다. * Routeaccept는 수동 트랜잭션 개체의 주요 처리 기능입니다. * @param env * @throws RouterException */ 공개 추상 무효 Routeaccept(Env env)가 RouterException을 발생시킵니다. /** * 라우팅 방식은 서비스의 외부 인터페이스 기능 * @throws RouterException */ public abstract void Routing() throws RouterException; |
다음으로 여기서 소개하지 않은 모든 서비스 클래스를 구현해야 합니다.
6.
이 라우터는 지금까지 동기 트랜잭션만 구현할 수 있으며 당분간 비동기 트랜잭션을 지원하지 않는다는
점을 설명합니다.그러나 Router는 Composite 모델을 사용하여 설계되었으므로 비동기 트랜잭션의 구현도 확장될 수 있으므로 여기서는 자세한 분석을 수행하지 않습니다.