2017-06-28 57 views
0

我是Spring Boot的新手,併爲我的大學項目工作編碼,我需要一些幫助。 我想創建一個彈簧啓動應用程序,它啓動一個工廠類,它將創建並啓動10個同步客戶端。這些客戶端必須不斷監聽隊列。以下是我的代碼。我不確定,如果我在正確的軌道上,需要一些幫助。我的實現是否正確?我如何確保創建10個同步客戶端?我如何使用標識符來確定哪些消息客戶端處理了消息?Spring Factory創建隊列中的同步消費者

Application.java

@SpringBootApplication 
public class Application { 

    @Bean 
    public MesFactory mesFactory(){ 
     return new MesFactory(); 
    } 

    public static void main(String... args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

public class MesFactory { 

    private ExecutorService executorService = 

    Executors.newFixedThreadPool(10); 

    @PostConstruct 
    public void build(){ 
     executorService.execute(() -> new MesClient()); 
    } 
} 


@Component 
@EnableJms 
public class MesClient { 

    private static final Log log = LogFactory.getLog(MesClient.class); 

    @Autowired 
    private JmsTemplate jmsTemplate; 

    @JmsListener(destination = "incoming-messages-queue") 
    public void receive(String message) { 
     System.out.println("Received <" + message + ">"); 
     doPerformMessage(message); 
    } 

    public void doPerformMessage(String message){ 
     // parsing happens here 
    } 

    @Bean 
    ConnectionFactory connectionFactory() { 
     return new RMQConnectionFactory(); 
    } 

    @Scheduled(fixedRate = 100000000L) 
    public void sendMessage() { 

     String message= "Hi World"; 

     // Coerce a javax.jms.MessageCreator 
     MessageCreator messageCreator = (Session session) -> { 
      return session.createTextMessage(message); 
     }; 

     // And publish to RabbitMQ using Spring's JmsTemplate 
     jmsTemplate.send("incoming-messages-queue", messageCreator); 
    } 

} 
+0

目前還不清楚你的意思是「同步客戶端」。該代碼將創建單個異步使用者。 –

+0

我想創建10個偵聽同一隊列的消息客戶端來處理消息。一旦消息被消息客戶端使用,那麼它應該同步。 – Matwfo

回答

0

設置引導屬性...

spring.jms.listener.concurrency=10 
spring.jms.listener.max-concurrency=10 

監聽器容器將啓動10個線程 - 來自同一個隊列中的每個消費;他們將調用JMS偵聽器方法。請參閱Spring Boot documentation - Application Properties並向下滾動到JMS部分。

+0

我設置了這些屬性。看起來好像我發佈了100條消息,似乎都是從1個客戶端獲取。有什麼辦法可以知道哪個消息客戶端從隊列中選取了一條消息進行處理。 – Matwfo

+0

如果您使用的是ActiveMQ,我認爲他使用1000的默認預取,這意味着一個消費者將獲得全部100條消息。您需要配置ActiveMQ以減少預取以更好地分發消息。 [見這裏](http://activemq.apache.org/what-is-the-prefetch-limit-for.html)。如果您編寫日誌消息(例如,通過slf4j),引導的默認配置包括線程名稱 - 每個使用者運行在不同的線程上。 –

+0

謝謝你加里。這對我有效。 – Matwfo

相關問題