开发监管提交确认解释器
本主题介绍如何扩展预设监管提交处理器类,以及如何使用监管部门特定的处理方法来改写确认处理方法。
解决方案
• 创建用于扩展预设监管提交处理器的自定义类。
• 创建用于注册自定义类的 xconf 条目。
解决方案元素
下表介绍解决方案元素。
元素
|
类型
|
说明
|
processAcknowledgement(String transmissionName, String transmissionContent)
|
API
|
用于处理从监管部门收到的关于监管提交的确认消息。
|
默认行为
默认实施仅用于演示和教学目的。预计各监管部门会为每一种监管提交类型提供确认声明编号和格式的相关文档。根据需要,实施者可以创建与所提供的文档相匹配的提交特定处理器。
“确认 1”包含下列格式的 JSON 字符串:
{
"ackNumber": 1,
"typeName": "<typeName>"
"name": "<regulatorySubmissionName>",
"number": "<regulatorySubmissionNumber>",
"remoteIdentifier": "<remoteIdentifier>"
}
“确认 2”包含下列格式的 JSON 字符串:
{
"ackNumber": 2,
"typeName": "<typeName>"
"remoteIdentifier": "<remoteIdentifier>"
"certificationNumber": "<certificateNumber>"
"expirationDate": "<exirationDate>"
"result": "SUCCESS|FAILURE"
}
根据
监管提交处理器接口,仅在收到“确认 2”时才会发送确认事件。
typename 包括在内,因为这是示例通用确认处理器。在监管提交类型特定的处理器中,
typename 已知,因为监管提交处理器与注册该处理器的类型之间存在一对一关系。
创建自定义类
要自定义确认处理,首先创建一个用于扩展 SimpleRegulatorySubmissionProcessor 的 Java 类 (您的处理器),或相应的可修订子类型处理器,然后改写 processAcknowledgment 方法。可修订子类型填充器可以是 AERSubmissionProcessor、ERSubmissionProcessor、RPSSubmissionProcessor 或 UDISubmissionProcessor。
下一示例显示了一个新的自定义类,该类包含已改写的 processAcknowledgment 方法的预设要求。ConditionalCheckoutRunner 用于通过禁止在调用多个服务时自动检出来防止多次迭代。
@Override
public boolean processAcknowledgement(String transmissionName, String transmissionContent) throws Exception {
new TransactionRunner() {
@Override
public void performBusinessProcess() throws Exception {
JSONObject jsonContent = new JSONObject(transmissionContent);
switch (jsonContent.getInt("ackNumber")) {
case 1:
String typeName = jsonContent.getString("typeName");
String number = jsonContent.getString("number");
RegulatorySubmission regulatorySubmission = RegulatorySubmissionHelper.service
.findRegulatorySubmissionByTypeAndAttribute(typeName, "number", number);
new ConditionalAutoCheckoutRunner<RegulatorySubmission>(regulatorySubmission) {
@Override
public RegulatorySubmission performBusinessProcess(RegulatorySubmission coRegSub)
throws Exception {
RegulatoryContentHelper.getService().storeRegulatoryContent(coRegSub,
RegulatoryContentCategory.ACKNOWLEDGEMENT1, transmissionName, transmissionContent);
return RegulatorySubmissionHelper.service.modifyRegulatorySubmission(coRegSub,
Map.of("remoteIdentifier", jsonContent.getString("remoteIdentifier")));
}
}.invoke();
break;
case 2:
String remoteIdentifier = jsonContent.getString("remoteIdentifier");
typeName = jsonContent.getString("typeName");
regulatorySubmission = RegulatorySubmissionHelper.service
.findRegulatorySubmissionByTypeAndAttribute(typeName, "remoteIdentifier", remoteIdentifier);
new ConditionalAutoCheckoutRunner<RegulatorySubmission>(regulatorySubmission) {
@Override
public RegulatorySubmission performBusinessProcess(RegulatorySubmission coRegSub)
throws Exception {
RegulatoryContentHelper.getService().storeRegulatoryContent(coRegSub,
RegulatoryContentCategory.ACKNOWLEDGEMENT2, transmissionName, transmissionContent);
if ("SUCCESS".equals(jsonContent.get("result"))) {
String expDateString = jsonContent.getString("expirationDate");
Timestamp expDate = Timestamp.valueOf(expDateString);
coRegSub = RegulatorySubmissionHelper.service.modifyRegulatorySubmission(coRegSub,
Map.of("certificateNumber", jsonContent.getString("certificateNumber"),
"expirationDate", expDate));
RegulatorySubmissionProcessorHelper.dispatchAcknowledgmentSuccessfulEvent(coRegSub);
}
else {
RegulatorySubmissionProcessorHelper.dispatchAcknowledgmentFailedEvent(coRegSub);
}
return coRegSub;
}
}.invoke();
break;
default:
break;
}
}
}.invoke();
return true;
}