Ana içeriğe geç

WS#

Bilgilendirme işlemlerinin yapıldığı uygulamadır. Web socket üzerinden client ile iletişim kurar. Rest uçları aktif edilip kullanılabilir.

Client#

Gradle Dependencies

compile (
    [group: 'tr.com.havelsan.framework.support.notification.cloud', name: 'hvl-notification-cloud-client', version: 'güncel versiyon repositoryden bakılmalıdır.']
)

Rest Servis Tanımı#

Feign client uçlarını kullanabilmek için konfigurasyon bean'ine @HvlEnabledNotificationClient anotasyonu eklenmelidir.

@Autowired
private HvlNotificationRestService notificationRestService;
HvlNotificationRestService.java üzerinden sağlanan uçlar

@HvlPublicFeignRestService
@FeignClient(name = "notificationMailRestService",
        path = "${hvl.notification.mail.service.path:/notification/mail}",
        url = "${hvl.notification.mail.service.url}")
public interface HvlNotificationMailRestService {

    @PostMapping(path = "/notify",
            consumes = MediaType.APPLICATION_JSON_VALUE)
    HvlResponse<Void> notify(@Valid @RequestBody HvlNotificationMailRequestModel notificationMailRequestModel)
            throws HvlNotificationMailException;

}

HvlNotificationStompWsMessage.java nesnesi

public class HvlNotificationStompWsMessage implements Serializable {

    @NotNull
    private List<String> targetList; //mesajın hangi subscriber'lara gönderileceği bilgisi

    private transient Object payload; //Gönderilecek mesaj

    public HvlNotificationStompWsMessage() {
    }

    public HvlNotificationStompWsMessage(Object payload, @NotNull String... targetList) {
        this.payload = payload;
        this.targetList = Arrays.asList(targetList);
    }

    public HvlNotificationStompWsMessage(Object payload, @NotNull List<String> targetList) {
        this.payload = payload;
        this.targetList = targetList;
    }
    //GETTER SETTER
}

Server Kullanımı#

Bildirim gönderilebilmesi için bildirim server'ın ayağa kaldırılması gerekmektedir. Server ayağa kaldırılırken aşağıdaki değerler ezilerek konfigüre edilebilir. Örnek docker-compose file'ı infra projesinde bulunmaktadır.

Swagger: http://{ip}:{port}/swagger-ui/index.html

Notification Server Application.yml

BROKERS: /user, /announcement

UI Client tarafının bildirim servera subscribe olabileceği uçlar brokers altından ayarlanmalıdır. Örnekteki /user ucu, kullanıcıların /user/acuhadaroglu veya /user/bocal şeklinde server'a subscribe olmasını sağlar. /announcement ucu ise genel bilgilendirmelerin yapılacağı uç olarak açılmış olup tüm kullanıcıların subscribe olacağı uçtur. Kullanım ihtiyaçlarına göre brokers'lar bu şekilde arttırılabilir.

Örnek STOMP Client (Java)#

Aşağıda java üzerinde yazılmış örnek bir client uygulaması bulunmaktadır.

Gradle Dependencies

compile (
    [group: 'org.springframework.boot', name: 'spring-boot-starter-websocket'],
)
SampleStompClient.java

public class SampleStompClient {

    public static void main(String[] args) {

        WebSocketClient simpleWebSocketClient = new StandardWebSocketClient();
        List<Transport> transports = new ArrayList<>(1);
        transports.add(new WebSocketTransport(simpleWebSocketClient));
        SockJsClient sockJsClient = new SockJsClient(transports);

        WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
        stompClient.setMessageConverter(new MappingJackson2MessageConverter());

        String url = "ws://localhost:7085/notification";
        StompSessionHandler sessionHandler = new MyStompSessionHandler();
        try {
            StompSession session = stompClient.connect(url, sessionHandler).get();

            session.subscribe("/user/acuhadaroglu", new StompFrameHandler() {
                @Override
                public Type getPayloadType(StompHeaders headers) {
                    return HvlNotificationResponse.class;
                }

                @Override
                public void handleFrame(StompHeaders headers, Object payload) {
                    System.err.println(payload.toString());
                }
            });

            session.subscribe("/announcement", new StompFrameHandler() {

                @Override
                public Type getPayloadType(StompHeaders headers) {
                    return HvlNotificationResponse.class;
                }

                @Override
                public void handleFrame(StompHeaders headers, Object payload) {
                    System.err.println(payload.toString());
                }
            });

            // Message msg = new Message("bocal", "Naber?");
            //session.send("/notificationServer/notify/acu", msg);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        new Scanner(System.in).nextLine();
    }

    private static class MyStompSessionHandler implements StompSessionHandler {

        @Override
        public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
            System.out.println("afterConnected");
        }

        @Override
        public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) {
            System.out.println("handleException");
            exception.printStackTrace();
        }

        @Override
        public void handleTransportError(StompSession session, Throwable exception) {
            System.out.println("handleTransportError");
            exception.printStackTrace();
        }

        @Override
        public Type getPayloadType(StompHeaders headers) {
            System.out.println("getPayloadType");
            return null;
        }

        @Override
        public void handleFrame(StompHeaders headers, Object payload) {
            System.out.println("handleFrame");
        }
    }
}

Client uygulamasını yukarıdaki gibi çalıştırdıktan sonra swagger üzerinden Notification Public altındaki /genel/notification/notifications/send ucundan aşağıdaki body ile tetiklenebilir.

{
    "payload": {"message": "hello world!"},
    "targetList": [
        "user/acuhadaroglu",
        "announcement"
    ]
}