Skip to content

Distributed event dispatcher based on Spring AMQP

Notifications You must be signed in to change notification settings

jakubtrzcinski/Priap

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 

Repository files navigation

Priap

Simple distributed event dispatcher with persistent hospital for failed events execution based on Spring AMQP

How it works

TODO

Requirements

Spring AMQP

Running RabbitMQ Instance

Instalation

Maven

<dependencies>
    <dependency>
        <groupId>pl.jakubtrzcinski</groupId>
        <artifactId>priap</artifactId>
        <version>1.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>pl.jakubtrzcinski</groupId>
        <artifactId>priap-api</artifactId>
        <version>1.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.amqp</groupId>
        <artifactId>spring-amqp</artifactId>
        <version>2.3.2</version>
    </dependency>
</dependencies>

Gradle

dependencies {
    compile 'pl.jakubtrzcinski:priap:1.0.1.RELEASE'
    compile 'org.springframework.amqp:spring-amqp:2.3.2'
}

Setting up

Annotation

@EnablePriap
@SpringBootApplication
class ExampleApplication {
    //[...]
}

Programaticly

 var priapSession = PriapSession.createForAmqp(
        "application",
        10, // Define how much listener threads should be created
        rabbitTemplate,
        rabbitTemplate,
        listeners // List<EventListener>
);
priapSession.run();
return priapSession;

Configuration

priap.threads=10 #Define how much listener threads should be created
spring.rabbitmq.username=rabbit
spring.rabbitmq.password=rabbit
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5671

Spring Example

Event

NOTE: All events has to be Serializable!

@Getter
@RequiredArgsConstructor
class ExampleEvent implements Serializable {
    private final String text;
}

Listener

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import pl.jakubtrzcinski.priap.api.EventListener;

@Slf4j
@Component
public class ExampleEventListener implements EventListener<ExampleEvent> {

    @Override
    public void process(ExampleEvent event) {
        log.error(event.getText());
    }
}

Event dispatching

import lombok.RequiredArgsConstructor;
import pl.jakubtrzcinski.priap.api.EventDispatcher;

@RequiredArgsConstructor
class FooService  {

    private final EventDispatcher eventDispatcher;
    
    public void foo() {
        eventDispatcher.dispatch(new ExampleEvent("Hello World"));
    }
}

Reruning failed events from hospital

NOTE: All events from hospital are reruned after Piriap Session is created

import lombok.RequiredArgsConstructor;
import pl.jakubtrzcinski.priap.PriapSession;

@RequiredArgsConstructor
class FooService  {

    private final PriapSession session;

    public void foo() {
        session.rerunFromHospital();
    }
}