Kopsox Application Services
Die "KopsoxApplicationServices" stellen verschiedene Services für Java-Applikationen (Java SE) zur Verfügung. Dazu zählen:
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):
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());
}
}
}
- Messaging
- EJB-Lookup (EJB >= 3.1!)
- Klassen für Security
- Session-Handling
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):
- sendMessageToAllConsumers
- sendMessageToConsumer
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: Java