/** * Release the group if it has more messages than the threshold and has not previously been released. * It is possible that more messages than the threshold could be released, but only if multiple consumers * receive messages from the same group concurrently. */ @Override public boolean canRelease(MessageGroup group) { return group.size() >= this.threshold; }
@Override @ManagedAttribute public int getMessageCountForAllMessageGroups() { int count = 0; for (MessageGroup group : this) { count += group.size(); } return count; }
@Test public void testSendAndActivate() throws InterruptedException { this.input.send(new GenericMessage<>("foo")); assertTrue(this.afterCommitLatch.await(10, TimeUnit.SECONDS)); assertEquals(1, Service.messages.size()); assertEquals(0, messageStore.getMessageGroup("JdbcMessageStoreChannelTests").size()); }
@Test public void shouldExpireMessageGroup() throws Exception { TestMessageStore store = new TestMessageStore(); final List<String> list = new ArrayList<String>(); store.registerMessageGroupExpiryCallback((messageGroupStore, group) -> { list.add(group.getOne().getPayload().toString()); messageGroupStore.removeMessageGroup(group.getGroupId()); }); store.expireMessageGroups(-10000); assertEquals("[foo]", list.toString()); assertEquals(0, store.getMessageGroup("bar").size()); }
@Test public void testSendAndActivateWithRollback() throws Exception { Service.fail = true; input.send(new GenericMessage<>("foo")); Service.await(10000); assertEquals(1, Service.messages.size()); // After a rollback in the poller the message is still waiting to be delivered assertEquals(1, messageStore.getMessageGroup("JdbcMessageStoreChannelTests").size()); }
@Test @DirtiesContext public void testActivatorSendsToPersistentQueue() throws Exception { input.send(createMessage("123", "id1", 3, 1, null)); handler.getLatch().await(100, TimeUnit.MILLISECONDS); assertEquals("The message payload is not correct", "123", handler.getMessageString()); // The group id for buffered messages is the channel name assertEquals(1, messageGroupStore.getMessageGroup("messageStore:output").size()); Message<?> result = output.receive(100); assertEquals("hello", result.getPayload()); assertEquals(0, messageGroupStore.getMessageGroup(BASE_PACKAGE + ".store:output").size()); }
@Test public void testMessageGroupWithAddedMessage() throws Exception { GemfireMessageStore store = new GemfireMessageStore(region); MessageGroup messageGroup = store.getMessageGroup(1); Message<?> message = new GenericMessage<String>("Hello"); messageGroup = store.addMessageToGroup(1, message); assertEquals(1, messageGroup.size()); // make sure the store is properly rebuild from Gemfire store = new GemfireMessageStore(region); messageGroup = store.getMessageGroup(1); assertEquals(1, messageGroup.size()); }
@Test @Transactional public void testAddAndGetMessageGroup() throws Exception { String groupId = "X"; Message<String> message = MessageBuilder.withPayload("foo").setCorrelationId(groupId).build(); long now = System.currentTimeMillis(); messageStore.addMessageToGroup(groupId, message); MessageGroup group = messageStore.getMessageGroup(groupId); assertEquals(1, group.size()); assertTrue("Timestamp too early: " + group.getTimestamp() + "<" + now, group.getTimestamp() >= now); }
@Test @Transactional public void testAddAndRemoveMessageFromMessageGroup() throws Exception { String groupId = "X"; Message<String> message = MessageBuilder.withPayload("foo").setCorrelationId(groupId).build(); messageStore.addMessageToGroup(groupId, message); messageStore.removeMessagesFromGroup(groupId, message); MessageGroup group = messageStore.getMessageGroup(groupId); assertEquals(0, group.size()); }
@Test public void shouldRemoveFromGroup() throws Exception { SimpleMessageStore store = new SimpleMessageStore(); Message<String> testMessage1 = MessageBuilder.withPayload("foo").build(); store.addMessageToGroup("bar", testMessage1); Message<?> testMessage2 = store.getMessageGroup("bar").getOne(); store.removeMessagesFromGroup("bar", testMessage2); MessageGroup group = store.getMessageGroup("bar"); assertEquals(0, group.size()); assertEquals(0, store.getMessageGroup("bar").size()); }
@Test public void testRemovalOfBarrierWhenLastMessageOfSequenceArrives() { QueueChannel replyChannel = new QueueChannel(); String correlationId = "ABC"; Message<?> message1 = createMessage("123", correlationId, 1, 1, replyChannel); resequencer.handleMessage(message1); assertEquals(0, store.getMessageGroup(correlationId).size()); }
@Test public void testNonExistingEmptyMessageGroup() throws Exception { GemfireMessageStore store = new GemfireMessageStore(region); MessageGroup messageGroup = store.getMessageGroup(1); assertNotNull(messageGroup); assertTrue(messageGroup instanceof SimpleMessageGroup); assertEquals(0, messageGroup.size()); }
@Test public void testOrderInMessageGroup() throws Exception { String groupId = "X"; this.messageStore.addMessagesToGroup(groupId, MessageBuilder.withPayload("foo").setCorrelationId(groupId).build()); Thread.sleep(1); this.messageStore.addMessagesToGroup(groupId, MessageBuilder.withPayload("bar").setCorrelationId(groupId).build()); MessageGroup group = this.messageStore.getMessageGroup(groupId); assertEquals(2, group.size()); assertEquals("foo", this.messageStore.pollMessageFromGroup(groupId).getPayload()); assertEquals("bar", this.messageStore.pollMessageFromGroup(groupId).getPayload()); }
@Test public void shouldListByCorrelation() throws Exception { SimpleMessageStore store = new SimpleMessageStore(); Message<String> testMessage1 = MessageBuilder.withPayload("foo").build(); store.addMessageToGroup("bar", testMessage1); assertEquals(1, store.getMessageGroup("bar").size()); }
@Test public void testAddAndGetMessageGroup() throws Exception { String groupId = "X"; Message<String> message = MessageBuilder.withPayload("foo").setCorrelationId(groupId).build(); long now = System.currentTimeMillis(); messageStore.addMessagesToGroup(groupId, message); MessageGroup group = messageStore.getMessageGroup(groupId); assertEquals(1, group.size()); assertTrue("Timestamp too early: " + group.getTimestamp() + "<" + now, group.getTimestamp() >= now); }
@Test @Transactional public void testCompleteMessageGroup() throws Exception { String groupId = "X"; Message<String> message = MessageBuilder.withPayload("foo").setCorrelationId(groupId).build(); messageStore.addMessageToGroup(groupId, message); messageStore.completeGroup(groupId); MessageGroup group = messageStore.getMessageGroup(groupId); assertTrue(group.isComplete()); assertEquals(1, group.size()); }
@Test @RedisAvailable public void testNonExistingEmptyMessageGroup() { RedisConnectionFactory jcf = getConnectionFactoryForTest(); RedisMessageStore store = new RedisMessageStore(jcf); MessageGroup messageGroup = store.getMessageGroup(this.groupId); assertNotNull(messageGroup); assertTrue(messageGroup instanceof SimpleMessageGroup); assertEquals(0, messageGroup.size()); }
@Test public void testAddAndRemoveMessageFromMessageGroup() throws Exception { String groupId = "X"; Message<String> message = MessageBuilder.withPayload("foo").setCorrelationId(groupId).build(); messageStore.addMessagesToGroup(groupId, message); messageStore.removeMessagesFromGroup(groupId, message); MessageGroup group = messageStore.getMessageGroup(groupId); assertEquals(0, group.size()); }
@Test public void testCompleteMessageGroup() throws Exception { String groupId = "X"; Message<String> message = MessageBuilder.withPayload("foo").setCorrelationId(groupId).build(); messageStore.addMessagesToGroup(groupId, message); messageStore.completeGroup(groupId); MessageGroup group = messageStore.getMessageGroup(groupId); assertTrue(group.isComplete()); assertEquals(1, group.size()); }
@Test public void testRepeatedAddAndRemoveGroup() throws Exception { SimpleMessageStore store = new SimpleMessageStore(10, 10); for (int i = 0; i < 10; i++) { store.addMessageToGroup("bar", MessageBuilder.withPayload("foo").build()); store.addMessageToGroup("bar", MessageBuilder.withPayload("foo").build()); store.removeMessageGroup("bar"); assertEquals(0, store.getMessageGroup("bar").size()); assertEquals(0, store.getMessageGroupCount()); } }