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

时间:2018-04-03 12:31:33

标签: java spring-boot soap iso8583 jpos

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

我们已按如下方式实施我们的系统:

enter image description here

我们在中间件(spring boot项目)中实现了一个ISOListner,它将传入的ISO消息转换为SOAP请求。

是否可以将Middle ware代码嵌入到JPOS服务器本身并省略mw?

如果可能,放置转换逻辑的正确位置是什么? 是 ChannelAdaptor 还是 TransactionManager

很少有博客建议我们可以将所有逻辑都放到TransactionManager或ChannelAdaptor上。如果是真的 然后为什么我们需要多路复用器和频道呢?或者我们的架构可以继续进行?

2 个答案:

答案 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将其发送到后端服务器。