Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo, ich habe eine REST API mit Spring Boot gebaut. 3 Schichten. Präsentation, Service und Datenhaltung (Controller, Geschäftslogik, Repository), Swagger, actuatur, Prometheus usw. Aber ich bin zu blöd für Eventhandling. Wenn z.B ein Get-Request reinkommt, soll ein Zähler hochgezählt werden. Das klappt mit einem Metrics Counter gut. Aber ich möchte das per Eventhandling hinbekommen. Also wenn ein Request (Get, Post, Put, egal) reinkommt, soll ein Zähler hochgezählt werden (oder was auch immer). Die bauen in den Tutorials immer eine Eventklasse um die Daten vorzuhalten. Das z.B. kapier ich nicht. Muss das sein? Wo bau ich den Publisher ein? Wo den Listener? Keine Ahnung? Ich bekomme den Code der Tutorials nicht auf meinen umgemünzt. Ich hab da ein totales Verständnisproblem. Kann jemand helfen?
Da Du von Publisher redest, gehe ich davon aus, dass das Publish- Subscriber Pattern gemeint ist. In diesem Fall ist der Publisher dann derjenige, der weiß was Du publishen möchtest, also wäre das in Deinem Fall vermutlich der Controller, da der Service nichts von GET, POST usw. weiß.
Java:
@RestController
public class FooController {
private final EventBus eventBus;
@Autowire
public FooController(final EventBus eventBus) {
this.eventBus = eventBus;
}
@GetMapping("/path")
public ResponseEntity<Object> getSomething() {
...
eventBus.post(new FooGetSomethingEvent());
...
}
}
Und wo auch immer Du das dann bearbeiten möchtest.
Java:
public class EventListener {
@Subscribe
public void fooGetSomethingEvent(FooGetSomethingEvent event) {
// do something with it.
}
}
Java:
EventListener listener = new EventListener();
eventBus.register(listener);
Hallo, danke erstmal. @Subcribe ist mir neu. Schau ich mir mal an. Bis jetzt war ich bei @RepositoryEventHandler, @TransactionalEventListener, @EventListener, extends ApplicationEvent... u.s.w. EventBus hatte ich auch als letztes am Wickel. Ich seh da nicht mehr durch. Mir raucht die Birne. :-D
Vielleicht ne dumme Frage, aber was genau hast du eigentlich vor? Nur einfach irgendwie irgendwo ohne besonderen Grund Events benutzen, oder haben Events da einen besonderen Zweck?
Das ist eine gute Frage. Meine aktuelle Aufgabe ist es, benutzerdefinierte Metriken für Prometheus zu erstellen. Mit den Möglichkeiten von MeterMetrics hab ich das auch hinbekommen (zumindest einen einfachen Counter). Der zählt aktuell jeden Neueintrag in die Datenbank und steht in Prometheus als Metrik zur Verfügung. Aber so richtig benutzerdefiniert ist das ja nicht. Die Metriken sind alle vorgegeben, man muss sie nur implementieren. Ich hab dann als Kopfnuß den Hinweis bekommen, das mit Eventhandlern zu machen. Aber da hab ich auf der Schulbank gepennt. :-D Selbst wenn ich das hinbekomme, hab ich keine Ahnung, wie ich eine eigene Methode zu einer von Prometheus verständlichen Metrik ummodeln kann. Also der Gedanke war jetzt, wenn z.B. ein GET-Request reinkommt, wird ein Event ausgelöst, welches dann eine Methode mit einer Funktion (z.B. Zähler) aufruft und den Wert als Metrik für Prometheus zurückgibt. Ich denke, daß mit dem Eventbus geht in die richtige Richtung. Da Der, letztendlich meinen mit andere Microservices "synchronisieren" wird. Ich weiß jetzt nicht, wie ich es besser beschreiben soll.
Ich bin es nur überflogen, aber es gibt ja viele Möglichkeiten wie man sowas machen kann. In dem Video klingt es für mich danach, das er die REST Schnittstelle zur Kommunikation der Services nimmt.
Du musst bei sowas immer Deinen Use-Case mit den Vor- und Nachteilen einzelner Möglichkeiten anschauen und dann die auswählen, die den Use-Case mit den geringsten Nachteilen erfüllt.
Aber wir kommen ein bisschen von einem ins andere, ein spezielles Problem kann ich irgendwie nicht mehr erkennen.
Eigene Metriken mit Prometheus und Eventbus mit Mikroservices und synchronisieren zwischen denen sind allerdings völlig verschiedene und unabhängige Dinge?
Wenn ich das zumindest halbwegs richtig verstanden habe, sollst du irgendeinem Projekt Metrik hinzufügen?
Und die sollen "Benutzerdefiniert" sein, wer ist denn da der Nutzer und wie soll der diese definieren?
Es ist mit peinlich, aber vor 4 Monaten hab ich mein erstes Hello World geschrieben. In den letzten vier Wochen dann das volle Programm Backendentwicklung im Praktikumsbetrieb. Nix mit Üben und Grundlagen wiederholen. Gleich Spring, Spring-Boot, RESTful Service, Swagger, Prometheus, Actuator, Webclient, Paginerung, Maven, Gradle usw. Vor einem Monat noch nie was davon gehört, hab das aber alles lösen können. Deswegen bitte ich um Nachsicht, wenn ich , trotz Bemühung, nicht ganz mitkomme. Ich hab hier mal ein Beispiel von Baeldung in Eclipse übernommen, um zu sehen was passiert. Es passiert natürlich nichts. Wie erwartet. Das Programm startet und schluß. Aber was muss passieren? Das ist die Frage? Klar, irgendwas muss das Event auslösen. Aber was? Ich steh da total auf dem Schlauch. Ich hab alles andere jetzt erstmal beiseite geschoben. Bevor ich diese Eventgeschichte nicht kappiert habe, brauch ich nicht weitermachen. Ich hoffe ihr helft mir dabei. Auch wenn es nach den Worten einiger Anderer, trivial sein soll.
Java:
import org.springframework.context.ApplicationEvent;
public class CustomSpringEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
private String message;
public CustomSpringEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
Java:
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class CustomSpringEventListener implements ApplicationListener<CustomSpringEvent> {
@Override
public void onApplicationEvent(CustomSpringEvent event) {
System.out.println("Received spring custom event - " + event.getMessage());
}
}
Java:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
@Component
public class CustomSpringEventPublisher {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
public void publishCustomEvent(final String message) {
System.out.println("Publishing custom event. ");
CustomSpringEvent customSpringEvent = new CustomSpringEvent(this, message);
applicationEventPublisher.publishEvent(customSpringEvent);
}
}
Java:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class EventApplication {
public static void main(String[] args) {
SpringApplication.run(EventApplication.class, args);
}
}