Начало работы - Historicteam/SctpClient GitHub Wiki

Эта небольшая статья должна помочь вам разобраться в том, как использовать SctpClient для взаимодействия с sc-memory.

Подготовка

Для использования библиотеки вам необходимо использовать java версии 1.8 и больше.

Рекомендуется использовать Maven для подключения библиотеки. Для добавления зависимости с его помощью, просто добавьте в pom.xml следующий текст:

<repositories>
  <repository>
	<id>SctpClient-mvn-repo</id>
	<url>https://raw.github.com//Historicteam/SctpClient/mvn-repo/</url>
	<snapshots>
	  <enabled>true</enabled>
	  <updatePolicy>always</updatePolicy>
	</snapshots>
  </repository>
</repositories>

<dependencies>
  <dependency>
	<groupId>by.ostis.mihas</groupId>
	<artifactId>sctp-client</artifactId>
	<version>2.1-beta</version>
  </dependency>
</dependencies>

Также можете скачать jar-файл c ветки mvn-repo.

Cоздание подключения

Задача SctpClient это предоставление интерфейса для взаимодействия с sc-memory. Самый простой способ для отправки sctp-запросов — это вызвать один из методов класса, реализующего интерфейс SctpSender. SctpClient предоставляет две реализации этого интерфейса: для отправки асинхронных и синхронных запросов. Для создания SctpSender-а рекомендуется использовать статические методы createSender или createAsyncSender класса SctpSenderCreator. В качестве параметров в обоих методах необходимо передать IP-адрес и номер порта SCTP-сервера.

import new_client.SctpSenderCreater;
import sender.SctpSender;
...
	SctpSender sctpSender = SctpSenderCreater.createSender("192.168.20.128", 55770);
...

По окончании работы с экземпляром SctpSender необходимо закрыть подключение. Для этого следует вызвать метод close у самого экземпляра либо у SctpSenderCreater, во втором случае будут закрыты соединения во всех SctpSender-ах, созданных с помощью SctpSenderCreater. Также для этой цели можно воспользоваться конструкцией try-with-resources, поскольку SctpSender реализует интерфейс autocloseable.

Выполнение запросов и обработка ответов

Оба SctpSender-а реализуют паттерн Fluent interface для методов выполняющих запросы к SCTP-серверу. Они возвращают FluentSctpResponse, у которого несколько методов, выполнение которых зависит от результата исполнения sctp-команды. succes, unsuccess, unfound, unavailable, error, exceprtion — все они принимают единственным параметром функциональные интерфейсы Commanda или CommandaWithParametr. Т.е. для обработки результатов запроса вам необходимо реализовывать функциональный интерфейс.

...
	sctpSender.create().success(scAddress -> {
		// этот метод выполниться в случае успешного выполнения команды
	}).unsuccess(() -> {
		// в случае безуспешного выполнения команды 
	}).unfound(() -> {
		// если указанный sc-элемент не найден
	}).unavailable(() -> {
		// недостаточно прав для выполнения команды
	}).error((returnCode) -> {
		// выполняется когда не произошло успешного выполнения команды
	}).exception((exception) -> {
		// этот метод выполниться, если при запросе возникнет исключительная ситуация
	})
...

Есть еще методы для получения результата кроме как через метод success. Например, по средствам метода get.

...
	ScAddress scAddr;
	try {
		scAddr = sctpSender.find(new ScString("OSTIS")).get();
	} catch (SctpException e) {
		e.printStackTrace();
	}
...

Или же можно получить обертку Optinal.

...
	Optional ScAddress optinal = sctpSender.create(ScNode.CLASS_CONST).getOptinal();
...

С возможностями обертки Optinal можете ознакомится по ссылке.

Использование алтернатив метода success при использовании асинхронного способа взаимодействия не рекомендуется. С полным списком доступных в SctpSender методов можно ознакомится [тут](Интерфейс SctpSender).

Пример

Данный пример создает в базе знаний константный узел и устанавливает ему основной идентификатор "SctpClient".

import exception.SctpException;
import model.scparametr.ScAddress;
import model.scparametr.ScString;
import model.scparametr.scelementtype.ScConnector;
import model.scparametr.scelementtype.ScNode;
import new_client.SctpSenderCreater;
import sender.SctpSender;

public class SctpClientExample {
    public static void main(String ...args) {
        try(SctpSender sctpSender = SctpSenderCreater.createSender("localhost", 55770)) {
            ScAddress nrel_main_idtf = sctpSender.find(new ScString("nrel_main_idtf")).get();
            ScAddress langAddr = sctpSender.find(new ScString("lang_en")).get();

            sctpSender.create(ScNode.CONST).success(nodeAddr -> {
                sctpSender.create().success(linkAddr -> {
                    sctpSender.link(linkAddr, new ScString("SctpClient"));

                    sctpSender.create(ScConnector.ARC_COMMON_CONST, nodeAddr, linkAddr).success(arcAddr -> {
                       sctpSender.create(ScConnector.ARC_ACCESS_POS_PERM_CONST, nrel_main_idtf, arcAddr);
                    });

                    sctpSender.create(ScConnector.ARC_ACCESS_POS_PERM_CONST, langAddr, linkAddr);
                });
            });
        } catch (SctpException e) {
            e.printStackTrace();
        }
    }
}
⚠️ **GitHub.com Fallback** ⚠️