Autowired не работает с образцом концентратора событий - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь реализовать пример EventHub от Microsoft, чтобы получить событие от концентраторов событий. https://docs.microsoft.com/fr-fr/azure/event-hubs/event-hubs-java-get-started-receive-eph

Я создал эти классы в приложении с весенней загрузкой и могу распечатать сообщения.

Я хотел обработать эти события, поэтому я решил создать сервис. @Autowired не может загрузить службу из контекста. Я не знаю почему;

@SpringBootApplication
    public class EventProcessorSample
{
    public static void main(String args[]) throws InterruptedException, ExecutionException
    {
############



        host.registerEventProcessor(EventProcessor.class, options)
        .whenComplete((unused, e) ->
        {


#######
        System.out.println("End of sample");
    }

Проблема здесь: услуга NULL Я пытался @Component или @Service для этого класса .. но служба не заполнена.

public static class EventProcessor implements IEventProcessor
{
    private int checkpointBatchingCount = 0;
@Autowired
ProcessingService processingservice;

    // onEvents is called when events are received on this partition of the Event Hub. 
    @Override
    public void onEvents(PartitionContext context, Iterable<EventData> events) throws Exception
    {
        System.out.println("SAMPLE: Partition " + context.getPartitionId() + " got event batch");
        int eventCount = 0;
        for (EventData data : events)
        {
            try
            {
                processingservice.process(new String(data.getBytes(), "UTF8"));

            }
            catch (Exception e)
            {
                System.out.println("Processing failed for an event: " + e.toString());
            }
        }
        System.out.println("SAMPLE: Partition " + context.getPartitionId() + " batch size was " + eventCount + " for host " + context.getOwner());
    }
}

Сервис:

@Service
public class ProcessingService {

public void process(String myMessage){
//Call Repository
}

}

Это потому, что registerHostProcessor использует тип класса в качестве параметра? Как загрузить службу для обработки и последующего вызова хранилища?

Спасибо.

Пакет простое приложение Springboot

src/main/java
 |
 +-- EventProcessorSample
 |    
 +-- service
 |  |  
 |  +-- ProcessingService
 |    
 +-- processor
 |  |  
 |  +-- EventProcessor
 |    
 +-- repository
 |  |  
 +  |-- MyRepository

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Вам необходимо изменить регистрационный код с:

 host.registerEventProcessor(EventProcessor.class, options)

до

@Autowired
    private EventProcessorFactory eventProcessorFactory;
...
    host.registerEventProcessorFactory(eventProcessorFactory)

Где

@Component
public class EventProcessorFactory implements IEventProcessorFactory<EventProcessor> {

    @Autowired
    ProcessingService processingservice;

    @Override
    public EventProcessor createEventProcessor(PartitionContext context) throws Exception {
        return new EventProcessor(processingservice);
    }

}

EventProcessorFactory - это компонент, в котором Spring управляет жизненным циклом. Вы можете вставить все, что вы хотите, в EventProcessorFactory, а затем вы можете передать EventProcessor, когда создадите его внутри фабричного метода. Таким образом, вы начинаете контролировать создание экземпляров EventProcessor.

Надеюсь, это поможет!

0 голосов
/ 18 сентября 2018

Ваш класс EventProcessor также должен быть bean-компонентом Spring - добавьте @Component и убедитесь, что механизм сканирования компонентов Spring может найти аннотированный класс ...

@Component
public class EventProcessor implements IEventProcessor
{
    private int checkpointBatchingCount = 0;
    private ProcessingService processingservice;

    // constructor injection of mandatory dependencies
    public EventProcessor(ProcessingService processingService) {
        this.processingService = processingService;
    }

    // onEvents is called when events are received on this partition of the Event Hub. 
    @Override
    public void onEvents(PartitionContext context, Iterable<EventData> events) throws Exception
    {
        //....
    }
}
...