Какое правильное место для размещения пользовательской логики в JPOS?

Я работаю над проектом, в котором запрос (ISO 8583) необходимо отправить через JPOS-сервер на резервный (удаленный хост согласно официальному документу) через API SOAP.

Мы реализовали нашу систему следующим образом:

введите здесь описание изображения

Мы внедрили ISOListner в промежуточное ПО (проект весенней загрузки), где он преобразует входящее сообщение ISO в запрос SOAP.

Можно ли встроить код Middle ware в сам сервер JPOS и опустить mw?

Если возможно, где правильно разместить нашу логику преобразования? Это ChannelAdaptor или TransactionManager?

Немногие блоги предполагают, что мы можем поместить всю логику в TransactionManager или ChannelAdaptor. Если это правда, то зачем вообще нужны мультиплексор и канал? Или наша архитектура подходит для продолжения?


person mnhmilu    schedule 03.04.2018    source источник


Ответы (2)


Для полноты я включу ответ на этот вопрос, который также задавался в группе пользователей jPOS (https://groups.google.com/forum/#!topic/jpos-users/PGzb4syQRzs):

Обычно мы реализуем настраиваемого участника, выполняющего действия SOAP/REST.

В случае с REST мы используем HTTP-клиент Apache (org.apache.httpcomponents:httpclient:4.5.5), который предоставляет хороший асинхронный интерфейс, отлично работающий с PAUSE в TransactionManager.

Вот пример:

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;
    }
person sprevilla    schedule 05.04.2018

TransactionManager — это подходящее место для добавления пользовательской логики. Я предполагаю, что вы используете мультиплексор и канал для отправки сообщения iso компоненту прослушивателя сокета MW. Этого можно избежать, используя промежуточное программное обеспечение, такое как rabbitmq, для подключения к внутренним серверам.

Например, isomessage в диспетчере транзакций можно преобразовать в json и отправить на внутренний сервер с помощью mq.

person pred    schedule 06.04.2018