私は初期化プログラムを使用してSpringブートプロジェクトを作成しましたが、私は最初のメッセージを作成しようとしていますが、私はJEEを使用する同じプロセスに精通していますので、工場、送信者、消費者を作成する必要があると思います。春のブートでjmsキューを実装する方法
誰かが私を助けることができますか?
私は初期化プログラムを使用してSpringブートプロジェクトを作成しましたが、私は最初のメッセージを作成しようとしていますが、私はJEEを使用する同じプロセスに精通していますので、工場、送信者、消費者を作成する必要があると思います。春のブートでjmsキューを実装する方法
誰かが私を助けることができますか?
を開始するのに最適な場所は、あなたのアプローチは、一般的に正しいですが、彼は骸骨のように見えるものである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());
}
私たちは行こうとしています!
ありがとうございます!これはとても役に立ちました! –
偉大な答えと参考資料。それらの警告は、jocklistenerアノテーション付きメソッドを使用してBeanのMockito.spy()に伝えたいだけです。スパイは実際にキューをリッスンしません。 – Wivani