我在一个项目中,需要通过SOAP API将请求(ISO 8583)通过 JPOS服务器发送到支持的(根据官方文档,远程主机)。

我们已经实现了我们的系统,如下所示:

java - 在JPOS中放置自定义逻辑的正确位置是什么?-LMLPHP

我们在中间件( 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;
    }

10-04 18:41