我在一个项目中,需要通过SOAP API将请求(ISO 8583)通过 JPOS服务器发送到支持的(根据官方文档,远程主机)。
我们已经实现了我们的系统,如下所示:
我们在中间件( Spring 启动项目)中实现了ISOListner,该中间件将传入的ISO消息传入的转换为SOAP请求。
是否可以将中间件代码嵌入JPOS服务器本身并省略mw?
如果可能,放置转换逻辑的正确位置是什么?
是 ChannelAdaptor 还是 TransactionManager ?
很少有博客建议我们可以将所有逻辑放到TransactionManager或ChannelAdaptor中。如果是真的
那么为什么我们需要多路复用器和通道?还是我们的架构可以继续进行?
最佳答案
为了完整起见,我将包括在jPOS用户组(https://groups.google.com/forum/#!topic/jpos-users/PGzb4syQRzs)中也提出的该问题的答案:
我们通常实现一个自定义参与者来执行SOAP / REST。
对于REST,我们使用Apache的HTTP客户端
(org.apache.httpcomponents:httpclient:4.5.5)提供了一个不错的选择
与TransactionManager的PAUSE配合使用的异步接口。
这是一个例子:
public int prepare (long id, Serializable o) {
Context ctx = (Context) o;
String url = getURL (ctx);
HttpPost post = new HttpPost(url);
StringEntity entity = new StringEntity(ctx.getString(JSON_REQUEST.name()),ContentType.create("application/json", Consts.UTF_8));
post.setEntity(entity);
try {
client.execute(post, response -> {
int sc = response.getStatusLine().getStatusCode();
if (sc == HttpStatus.SC_CREATED || sc == HttpStatus.SC_OK)
ctx.put (JSON_RESPONSE.name(), EntityUtils.toString(response.getEntity()));
ctx.resume();
return null;
});
return PREPARED | PAUSE | NO_JOIN | READONLY;
} catch (IOException e) {
warn (e);
}
return ABORTED;
}