/** * Pass the message through the selector chain. Whether the Message is * {@link #accept(Message) accepted} is based upon the tallied results of * the individual selectors' responses in accordance with this chain's * {@link VotingStrategy}. */ @Override public final boolean accept(Message<?> message) { int count = 0; int accepted = 0; for (MessageSelector next : this.selectors) { count++; if (next.accept(message)) { if (this.votingStrategy.equals(VotingStrategy.ANY)) { return true; } accepted++; } else if (this.votingStrategy.equals(VotingStrategy.ALL)) { return false; } } return this.decide(accepted, count); }
@Test public void anyStrategyRejects() { MessageSelectorChain chain = new MessageSelectorChain(); chain.setVotingStrategy(MessageSelectorChain.VotingStrategy.ANY); chain.add(new TestSelector(false)); chain.add(new TestSelector(false)); chain.add(new TestSelector(false)); chain.add(new TestSelector(false)); assertFalse(chain.accept(message)); }
@Test public void testNonAcceptedTypeIsNotSelected() { PayloadTypeSelector selector = new PayloadTypeSelector(Integer.class); assertFalse(selector.accept(new GenericMessage<>("test"))); }
@Bean public IdempotentReceiverInterceptor idempotentReceiverInterceptor() { IdempotentReceiverInterceptor idempotentReceiverInterceptor = new IdempotentReceiverInterceptor(new MetadataStoreSelector(m -> m.getPayload().toString())); idempotentReceiverInterceptor.setDiscardChannelName("idempotentDiscardChannel"); idempotentReceiverInterceptor.setThrowExceptionOnRejection(true); return idempotentReceiverInterceptor; }
@Test public void testMessageWithNullExpirationDateNeverExpires() { Message<String> message = MessageBuilder.withPayload("unexpired").build(); UnexpiredMessageSelector selector = new UnexpiredMessageSelector(); assertTrue(selector.accept(message)); }
@Test public void majorityStrategyWithOddNumberRejects() { MessageSelectorChain chain = new MessageSelectorChain(); chain.setVotingStrategy(MessageSelectorChain.VotingStrategy.MAJORITY); chain.add(new TestSelector(false)); chain.add(new TestSelector(true)); chain.add(new TestSelector(false)); assertFalse(chain.accept(message)); }
@Test public void testAcceptedTypeIsSelected() { PayloadTypeSelector selector = new PayloadTypeSelector(String.class); assertTrue(selector.accept(new GenericMessage<>("test"))); }
@Test public void testExpiredMessageRejected() { long past = System.currentTimeMillis() - 60000; Message<String> message = MessageBuilder.withPayload("expired") .setExpirationDate(past).build(); UnexpiredMessageSelector selector = new UnexpiredMessageSelector(); assertFalse(selector.accept(message)); }
@Test public void allStrategyAccepts() { MessageSelectorChain chain = new MessageSelectorChain(); chain.setVotingStrategy(MessageSelectorChain.VotingStrategy.ALL); chain.add(new TestSelector(true)); chain.add(new TestSelector(true)); chain.add(new TestSelector(true)); assertTrue(chain.accept(message)); }
@Test public void testSuperclassOfAcceptedTypeIsNotSelected() { PayloadTypeSelector selector = new PayloadTypeSelector(RuntimeException.class); assertFalse(selector.accept(new ErrorMessage(new Exception("test")))); }
@Test public void majorityOrTieStrategyWithEvenNumberRejects() { MessageSelectorChain chain = new MessageSelectorChain(); chain.setVotingStrategy(MessageSelectorChain.VotingStrategy.MAJORITY_OR_TIE); chain.add(new TestSelector(false)); chain.add(new TestSelector(true)); chain.add(new TestSelector(false)); chain.add(new TestSelector(false)); assertFalse(chain.accept(message)); }
@Test public void testSubclassOfAcceptedTypeIsSelected() { PayloadTypeSelector selector = new PayloadTypeSelector(RuntimeException.class); assertTrue(selector.accept(new ErrorMessage(new MessagingException("test")))); }
@Test public void majorityStrategyWithEvenNumberAccepts() { MessageSelectorChain chain = new MessageSelectorChain(); chain.setVotingStrategy(MessageSelectorChain.VotingStrategy.MAJORITY); chain.add(new TestSelector(true)); chain.add(new TestSelector(true)); chain.add(new TestSelector(false)); chain.add(new TestSelector(true)); assertTrue(chain.accept(message)); }
@Test public void majorityOrTieStrategyWithOddNumberRejects() { MessageSelectorChain chain = new MessageSelectorChain(); chain.setVotingStrategy(MessageSelectorChain.VotingStrategy.MAJORITY_OR_TIE); chain.add(new TestSelector(false)); chain.add(new TestSelector(true)); chain.add(new TestSelector(false)); assertFalse(chain.accept(message)); }
@Test public void anyStrategyAccepts() { MessageSelectorChain chain = new MessageSelectorChain(); chain.setVotingStrategy(MessageSelectorChain.VotingStrategy.ANY); chain.add(new TestSelector(false)); chain.add(new TestSelector(false)); chain.add(new TestSelector(true)); chain.add(new TestSelector(false)); assertTrue(chain.accept(message)); }
@Test public void majorityOrTieStrategyWithEvenNumberAccepts() { MessageSelectorChain chain = new MessageSelectorChain(); chain.setVotingStrategy(MessageSelectorChain.VotingStrategy.MAJORITY_OR_TIE); chain.add(new TestSelector(true)); chain.add(new TestSelector(true)); chain.add(new TestSelector(false)); chain.add(new TestSelector(false)); assertTrue(chain.accept(message)); }
@Test public void majorityStrategyWithEvenNumberRejects() { MessageSelectorChain chain = new MessageSelectorChain(); chain.setVotingStrategy(MessageSelectorChain.VotingStrategy.MAJORITY); chain.add(new TestSelector(false)); chain.add(new TestSelector(true)); chain.add(new TestSelector(true)); chain.add(new TestSelector(false)); assertFalse(chain.accept(message)); }
@Test public void majorityOrTieStrategyWithOddNumberAccepts() { MessageSelectorChain chain = new MessageSelectorChain(); chain.setVotingStrategy(MessageSelectorChain.VotingStrategy.MAJORITY_OR_TIE); chain.add(new TestSelector(true)); chain.add(new TestSelector(true)); chain.add(new TestSelector(false)); assertTrue(chain.accept(message)); }
@Test public void allStrategyRejects() { MessageSelectorChain chain = new MessageSelectorChain(); chain.setVotingStrategy(MessageSelectorChain.VotingStrategy.ALL); chain.add(new TestSelector(true)); chain.add(new TestSelector(false)); chain.add(new TestSelector(true)); assertFalse(chain.accept(message)); }
@Test public void majorityStrategyWithOddNumberAccepts() { MessageSelectorChain chain = new MessageSelectorChain(); chain.setVotingStrategy(MessageSelectorChain.VotingStrategy.MAJORITY); chain.add(new TestSelector(true)); chain.add(new TestSelector(true)); chain.add(new TestSelector(false)); assertTrue(chain.accept(message)); }