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.
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
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
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.