Sunday, November 13, 2011

Kopsox Application Services

Die "KopsoxApplicationServices" stellen verschiedene Services für Java-Applikationen (Java SE) zur Verfügung. Dazu zählen:
  • Messaging
  • EJB-Lookup (EJB >= 3.1!)
  • Klassen für Security
  • Session-Handling
Alle Services sind sehr simple gehalten!

In diesem Post gehe ich auf das Messaging-System näher ein. Zentrale Komponente ist die Klasse:

SimpleMessageService

Bei dieser Klasse können Komponenten registriert werden, die dann vom Message-Service benachrichtig werden, sobald Messages verschickt werden. Eine Kompemente muss das Interface "MessageConsumer" implementieren oder von der abstrakten Klasse "AbstractMessageConsumer" erben, sodass sie beim "SimpleMessageService" registriert werden kann.

Jeder Klasse die von "AbstractMessageConsumer" erbt, können Filter zugeordnet werden (über den Konstruktor oder mit der Annotation "@MessageFilters"). Mit diesen Filtern können Messages ausgewählt werden, die dann bearbeitet werden sollen. Filter müssen das Interface "MessageFilter" implementieren.

Das "SimpleMessageSerive" stellt 2 Methoden zum verschicken von Messages zur Verfügung (meiner Meinung nach sind die Methoden selbsterklärend):
  1. sendMessageToAllConsumers
  2. sendMessageToConsumer
Die Messages werden von diesen beiden Methoden asynchron verschickt, dh jede Message wird in einem eigenen Thread abgehandelt.

Die folgende Test-Klasse zeigt die Verwendung des Services:

/**
 * @author Konrad Renner
 *
 */
public class AbstractMessageConsumerTest {
  
  protected static final String CONSUMER_NAME = "TestMessageConsumer";
  
  TestMessageConsumer testConsumer;
  
  @Before
  public void setUp() {
    testConsumer = new TestMessageConsumer();
    
    Assert.assertTrue(SimpleMessageService.registerConsumer(CONSUMER_NAME, testConsumer));
  }

  @Test
  public void testMessageSendingAndReceiving() throws Exception {
    SimpleMessage messageOne = new StandardMessage("messageOne",this);
    SimpleMessage messageHello = new StandardMessage("Hello",this);
    SimpleMessage messageConsumer = new StandardMessage("Hello",testConsumer);
    
    SimpleMessageService.sendMessageToAllConsumers(messageOne);
    SimpleMessageService.sendMessageToAllConsumers(messageHello);
    SimpleMessageService.sendMessageToAllConsumers(messageConsumer);
    
    Assert.assertTrue(SimpleMessageService.sendMessageToConsumer(CONSUMER_NAME,messageHello));
    Assert.assertFalse(SimpleMessageService.sendMessageToConsumer("test",messageHello));
    
    Thread.sleep(1000);
    
    Assert.assertEquals(2,this.testConsumer.receivedMessageCount);
  }
  
  @After
  public void tearTown() {
    Assert.assertTrue(SimpleMessageService.unregisterConsumer(CONSUMER_NAME));
  }
  
  
  @MessageFilters(filters = TestMessageFilter.class)
  private class TestMessageConsumer extends AbstractMessageConsumer{

    private String name = "TestMessageConsumer";
    protected int receivedMessageCount;
    
    TestMessageConsumer(){
      super();
      receivedMessageCount = 0;
    }
    
    @Override
    public void retrieveMessage(SimpleMessage message) {
      receivedMessageCount++;
      
      Assert.assertEquals("Hello", message.getText());
      Assert.assertNotSame(this, message.getSender());
    }

    

    @Override
    public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + getOuterType().hashCode();
      result = prime * result + ((name == null) ? 0 : name.hashCode());
      return result;
    }

    @Override
    public boolean equals(Object obj) {
      if (this == obj)
        return true;
      if (obj == null)
        return false;
      if (getClass() != obj.getClass())
        return false;
      TestMessageConsumer other = (TestMessageConsumer) obj;
      if (!getOuterType().equals(other.getOuterType()))
        return false;
      if (name == null) {
        if (other.name != null)
          return false;
      } else if (!name.equals(other.name))
        return false;
      return true;
      
    }

    private AbstractMessageConsumerTest getOuterType() {
      return AbstractMessageConsumerTest.this;
    }

    @Override
    public String toString() {
      return "TestMessageConsumer [name=" + name + "]";
    }
    
  }
  
  public static class TestMessageFilter implements MessageFilter{

    
    @Override
    public boolean isMessageServiceable(MessageConsumer consumer, SimpleMessage message) {
      return "Hello".equalsIgnoreCase(message.getText());
    }
    
  }
  
  
}


Labels:

Thursday, November 10, 2011

Vielleicht

Werde ich wieder öfters Beiträge schreiben. Dann kann ich in 4 Jahren wieder über mich lachen ;-)

Lang ists her

Lang ists her, das ich einen Post erstellt habe. Ist schon lustig, wenn man sich 4 Jahre alte Posts durchschaut :-D