2015-12-20 42 views
0

是否可以在Spring Boot中使用事件?我需要執行一個方法,但不等待返回。我試圖用這個:Spring Boot中的事件

public class GerarSeloEvent extends ApplicationEvent { 

    private TbPedido pedido; 
    private Integer cdCartorio; 

    public GerarSeloEvent(Object source, TbPedido pedido, Integer cdCartorio) { 
     super(source); 
     this.pedido = pedido; 
     this.cdCartorio = cdCartorio; 
    } 

    public TbPedido getPedido() { 
     return pedido; 
    } 

    public Integer getCdCartorio() { 
     return cdCartorio; 
    } 
} 

@Component 
public class GerarSeloListener implements ApplicationListener<GerarSeloEvent> { 
    @Autowired 
    SeloService seloService; 
    @Override 
    public void onApplicationEvent(GerarSeloEvent event) { 
     seloService.gerarSelos(event.getPedido(), event.getCdCartorio()); 
    } 
} 

和我的電話

GerarSeloEvent gerarSelos = new GerarSeloEvent(this, pedido, cdCartorio); 
EnviarEmailPedidoEvent enviarEmail = new EnviarEmailPedidoEvent(this, pedido); 
publisher.publishEvent(gerarSelos); 

但我的代碼等待返回任何東西到我的前端。我需要一個異步事件。

+0

不知道你如何構建你的代碼,理想情況下,應以在異步模式下做任何事情異步但仍然可以工作「穿」是最常見的可用選項。嘗試一下。 – Avis

+0

Springs應用程序事件在默認情況下是同步的,否則您可以配置它。一種方法是簡單地在你的監聽器的'onApplicationEvent'上放置'@ ASync'來使它成爲異步(或你的服務方法)。否則不要使用事件並簡單地創建您要調用的異步服務方法。 –

回答

1

這應該工作:

@Component 
public class GerarSeloListener { 

    private final SeloService seloService; 

    @Autowired 
    public GerarSeloListener(SeloService seloService) { ... } 

    @EventListener 
    @Async 
    public void handleGerarSeloEvent(GerarSeloEvent event event) { 
     .... 
    } 

您需要在您的配置的一個補充@EnableAsync(最好的地方就是你@SpringBootApplication註解類)。但是正如馬丁所說的,如果你想異步處理一個方法,你不需要事件:只需要添加@Async並按照通常的方式調用它。

你可能想to read the documentation