2016-12-02 5 views
2

私は初期化プログラムを使用してSpringブートプロジェクトを作成しましたが、私は最初のメッセージを作成しようとしていますが、私はJEEを使用する同じプロセスに精通していますので、工場、送信者、消費者を作成する必要があると思います。春のブートでjmsキューを実装する方法

誰かが私を助けることができますか?

答えて

10

を開始するのに最適な場所は、あなたのアプローチは、一般的に正しいですが、彼は骸骨のように見えるものであるprojects getting started guide

です。

最初のspring-bootは完全な設定ファイル構造を提供します。NetbeansのようなスマートなIDEを使用している場合は、spring-bootプラグインを追加すると、プロパティファイルでも自動補完できます。それぞれのブローカーとは少し違った動作をするので、私の使用例ではActiveMQ

ActiveMQをビルドパスに置くだけで、Springブートは自動的にActiveMQブローカーを設定します。接続プーリングなしでメモリブローカにするために、いくつかのプロパティを設定する必要があります。これを行うには、Spring Bootの2つのプロパティを設定します。

spring.activemq.in-memory=true 
spring.activemq.pooled=false 
jms.bookmgrqueue.name=book-mgr-queue #queue name 

他のブローカーでも同様の設定が可能です。

まず、Springアプリケーションの設定から始めます。 JMSサポートを有効にしてから新しいキューを設定するには、@EnableJmsアノテーションを配置する必要があります。

@EnableJms 
@Configuration 
public class JmsConfiguration { 

    @Autowired 
    private BeanFactory springContextBeanFactory; 

    @Bean 
    public DefaultJmsListenerContainerFactory containerFactory(ConnectionFactory connectionFactory) { 
     DefaultJmsListenerContainerFactory factory = 
       new DefaultJmsListenerContainerFactory(); 
     factory.setConnectionFactory(connectionFactory); 
     factory.setDestinationResolver(new BeanFactoryDestinationResolver(springContextBeanFactory)); 
     factory.setConcurrency("3-10"); 
     return factory; 
    } 

    @Bean 
    public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) throws JMSException { 
     return new JmsTemplate(connectionFactory); 
    } 

} 

例メッセージ

をキューを聴くリスナー成分(BookMgrQueueListener.java)所与の動作ヘッダとメッセージを読み取るためのセレクタを有するばねの@JmsListenerアノテーションを使用しています。私たちは、新しい設定ファイル、ActiveMqConfiguration.javaでのActiveMQブローカーを設定しているコンフィギュレーションをテストするためのテスト

ため

@Component 
public class BookMgrQueueListener implements Loggable{ 

    private final BookService bookService; 

    @Autowired 
    public BookMgrQueueListener(BookService bookService) { 
     this.bookService = bookService; 
    } 

    @JmsListener(containerFactory = "containerFactory", 
       destination = "bookMgrQueueDestination", 
       selector = "Operation = 'Create'") 
    public void processCreateBookMessage(BookDTO book) throws JMSException{ 
     bookService.createNew(book); 
    } 

    @JmsListener(containerFactory = "containerFactory", 
       destination = "bookMgrQueueDestination", 
       selector = "Operation = 'Update'") 
    public void processUpdateBookMessage(BookDTO book) throws JMSException{ 
     bookService.update(book.getIsbn(), book); 
    } 

    @JmsListener(containerFactory = "containerFactory", 
       destination = "bookMgrQueueDestination", 
       selector = "Operation = 'Delete'") 
    public void processDeleteBookMessage(BookDTO book) throws JMSException{ 
     bookService.delete(book.getIsbn()); 
    } 

} 

アクティブMQ。

@Configuration 
public class ActiveMqConfiguration { 

    public static final String ADDRESS = "vm://localhost"; 

    private BrokerService broker; 

    @Bean(name="bookMgrQueueDestination") 
    public Destination bookMgrQueueDestination(@Value("${jms.bookmgrqueue.name}") String bookMgrQueueName) 
      throws JMSException { 
     return new ActiveMQQueue(bookMgrQueueName); 
    } 

    @PostConstruct 
    public void startActiveMQ() throws Exception { 
     broker = new BrokerService(); 
     // configure the broker 
     broker.setBrokerName("activemq-broker"); 
     broker.setDataDirectory("target"); 
     broker.addConnector(ADDRESS); 
     broker.setUseJmx(false); 
     broker.setUseShutdownHook(false); 
     broker.start(); 
    } 

    @PreDestroy 
    public void stopActiveMQ() throws Exception { 
     broker.stop(); 
    } 

    @Bean 
    public ConnectionFactory connectionFactory() { 
     return new ActiveMQConnectionFactory(ADDRESS + "?broker.persistent=false"); 
    } 
} 

我々はテストケースでは、完全なアプリケーションコンテキストを設定しているが、我々は、我々は正しい呼び出しが実行されたかどうかを確認するために使用するMockedBookServiceにリスナーにBookServiceを参照を交換しています。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = Application.class, loader = SpringApplicationContextLoader.class) 
@WebAppConfiguration 
public class BookMgrQueueListenerIntegrationTest { 

    @Autowired(required = false) 
    private JmsTemplate jmsTemplate; 

    @Autowired 
    private BookMgrQueueListener bookMgrQueueListener; 


    @Autowired(required = false) 
    @Qualifier("bookMgrQueueDestination") 
    private Destination bookMgrQueueDestination; 

    @Mock 
    private BookService mockBookService; 

    @Captor 
    private ArgumentCaptor<BookDTO> bookArgumentCaptor; 

    @Before 
    public void setUp(){ 
     MockitoAnnotations.initMocks(this); 
     ReflectionTestUtils.setField(bookMgrQueueListener, "bookService", mockBookService); 
    } 

    /* ... tests */ 
} 

最後に、すべての操作のテストを追加して、サービスレイヤが正しい操作とパラメータで呼び出されたかどうかを確認します。

/* ... */ 
public class BookMgrQueueListenerIntegrationTest { 
    /* ... */ 
    @Test 
    public void testSendCreateBookMessage(){ 
     BookDTO book = new BookDTO("isbn", "title", "author"); 
     jmsTemplate.convertAndSend(bookMgrQueueDestination, book, Message -> { 
      return OperationHeader.CREATE.applyToMessage(Message); 
     }); 
     // verify 
     verify(mockBookService).createNew(bookArgumentCaptor.capture()); 
     assertEquals(book.getIsbn(), bookArgumentCaptor.getValue().getIsbn()); 
     assertEquals(book.getTitle(), bookArgumentCaptor.getValue().getTitle()); 
     assertEquals(book.getAuthor(), bookArgumentCaptor.getValue().getAuthor()); 
    } 

    @Test 
    public void testSendUpdateBookMessage(){ 
     BookDTO book = new BookDTO("isbn", "title", "author"); 
     jmsTemplate.convertAndSend(bookMgrQueueDestination, book, Message -> { 
      return OperationHeader.UPDATE.applyToMessage(Message); 
     }); 
     // verify 
     verify(mockBookService).update(eq(book.getIsbn()), bookArgumentCaptor.capture()); 
     assertEquals(book.getIsbn(), bookArgumentCaptor.getValue().getIsbn()); 
     assertEquals(book.getTitle(),bookArgumentCaptor.getValue().getTitle()); 
     assertEquals(book.getAuthor(),bookArgumentCaptor.getValue().getAuthor()); 
    } 

    @Test 
    public void testSendDeleteBookMessage(){ 
     BookDTO book = new BookDTO("isbn", "title", "author"); 
     jmsTemplate.convertAndSend(bookMgrQueueDestination, book, Message -> { 
      return OperationHeader.DELETE.applyToMessage(Message); 
     }); 
     // verify 
     verify(mockBookService).delete(book.getIsbn()); 
    } 

私たちは行こうとしています!

参考文献Integrate JMS queue into a Spring Application

+2

ありがとうございます!これはとても役に立ちました! –

+1

偉大な答えと参考資料。それらの警告は、jocklistenerアノテーション付きメソッドを使用してBeanのMockito.spy()に伝えたいだけです。スパイは実際にキューをリッスンしません。 – Wivani

関連する問題