我正在一个项目中,请求(ISO 8583)需要通过SOAP JPOS服务器发送到支持的(远程主机,根据官方文档) API。
我们已按如下方式实施我们的系统:
我们在中间件(spring boot项目)中实现了一个ISOListner,它将传入的ISO消息转换为SOAP请求。
是否可以将Middle ware代码嵌入到JPOS服务器本身并省略mw?
如果可能,放置转换逻辑的正确位置是什么? 是 ChannelAdaptor 还是 TransactionManager ?
很少有博客建议我们可以将所有逻辑都放到TransactionManager或ChannelAdaptor上。如果是真的 然后为什么我们需要多路复用器和频道呢?或者我们的架构可以继续进行?
答案 0 :(得分:0)
为了完整起见,我将在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;
}
答案 1 :(得分:0)
TransactionManager是添加自定义逻辑的正确位置。我想你正在使用mux和channel将iso消息发送到MW套接字监听器组件。使用像rabbitmq这样的中间件连接到后端服务器可以避免这种情况。
例如,事务管理器中的isomessage可以转换为json并使用mq将其发送到后端服务器。