1
2
3
4
5
6
7
8
9
10
11 package org.mule.test.integration.service;
12
13 import org.mule.api.MuleException;
14 import org.mule.api.endpoint.InboundEndpoint;
15 import org.mule.api.service.Service;
16 import org.mule.transport.jms.JmsConnector;
17 import org.mule.transport.jms.JmsSupport;
18 import org.mule.util.queue.Queue;
19 import org.mule.util.queue.QueueSession;
20 import org.mule.util.xa.ResourceManagerSystemException;
21
22 import javax.jms.JMSException;
23 import javax.jms.Message;
24 import javax.jms.MessageConsumer;
25 import javax.jms.MessageListener;
26
27 import edu.emory.mathcs.backport.java.util.concurrent.CountDownLatch;
28 import edu.emory.mathcs.backport.java.util.concurrent.TimeUnit;
29
30 public class ServiceInFlightMessagesJMSTestCase extends ServiceInFlightMessagesTestCase
31 {
32 private final int timeout = getTestTimeoutSecs() * 1000 / 20;
33
34 @Override
35 protected String getConfigResources()
36 {
37 return "org/mule/test/integration/service/service-inflight-messages-jms.xml";
38 }
39
40 @Override
41 public void testInFlightMessages() throws Exception
42 {
43 Service service = muleContext.getRegistry().lookupService("TestService");
44 TestJMSMessageListener listener = createTestJMSConsumer();
45 populateSedaQueue(service, NUM_MESSAGES);
46
47 muleContext.stop();
48
49 assertTrue(listener.countdownLatch.await(timeout, TimeUnit.MILLISECONDS));
50
51 assertNoLostMessages(NUM_MESSAGES, service, listener);
52
53
54 assertSedaQueueEmpty(service);
55 }
56
57 @Override
58 public void testInFlightMessagesPausedService() throws Exception
59 {
60 Service service = muleContext.getRegistry().lookupService("PausedTestService");
61 TestJMSMessageListener listener = createTestJMSConsumer();
62 populateSedaQueue(service, NUM_MESSAGES);
63
64 muleContext.stop();
65
66
67 assertSedaQueueEmpty(service);
68
69
70 }
71
72 @Override
73 public void testInFlightStopPersistentMessages() throws Exception
74 {
75 Service service = muleContext.getRegistry().lookupService("TestPersistentQueueService");
76 final TestJMSMessageListener listener = createTestJMSConsumer();
77 populateSedaQueue(service, NUM_MESSAGES);
78
79 muleContext.stop();
80
81
82 assertSedaQueueNotEmpty(service);
83
84
85 muleContext.start();
86 reregisterTestJMSConsumer(listener);
87
88 assertTrue(listener.countdownLatch.await(timeout, TimeUnit.MILLISECONDS));
89 assertNoLostMessages(NUM_MESSAGES, service, listener);
90 assertSedaQueueEmpty(service);
91
92
93
94
95 }
96
97 @Override
98 public void testInFlightStopPersistentMessagesPausedService() throws Exception
99 {
100 Service service = muleContext.getRegistry().lookupService("PausedTestPersistentQueueService");
101 TestJMSMessageListener listener = createTestJMSConsumer();
102 populateSedaQueue(service, NUM_MESSAGES);
103
104 muleContext.stop();
105
106
107 assertNoLostMessages(NUM_MESSAGES, service, listener);
108
109
110 muleContext.start();
111 reregisterTestJMSConsumer(listener);
112 service.resume();
113
114 listener.countdownLatch.await(timeout, TimeUnit.MILLISECONDS);
115 assertNoLostMessages(NUM_MESSAGES, service, listener);
116 assertSedaQueueEmpty(service);
117 }
118
119 @Override
120 public void testInFlightDisposePersistentMessages() throws Exception
121 {
122 Service service = muleContext.getRegistry().lookupService("TestPersistentQueueService");
123 TestJMSMessageListener listener = createTestJMSConsumer();
124 populateSedaQueue(service, NUM_MESSAGES);
125
126 muleContext.stop();
127
128
129 muleContext.dispose();
130 muleContext = createMuleContext();
131 muleContext.start();
132 reregisterTestJMSConsumer(listener);
133
134 assertTrue(listener.countdownLatch.await(timeout, TimeUnit.MILLISECONDS));
135 assertNoLostMessages(NUM_MESSAGES, service, listener);
136 assertSedaQueueEmpty(service);
137 }
138
139 private TestJMSMessageListener createTestJMSConsumer() throws MuleException, JMSException
140 {
141 TestJMSMessageListener messageListener = new TestJMSMessageListener();
142 createJMSMessageConsumer().setMessageListener(messageListener);
143 return messageListener;
144 }
145
146 private void reregisterTestJMSConsumer(TestJMSMessageListener listener)
147 throws MuleException, JMSException
148 {
149 createJMSMessageConsumer().setMessageListener(listener);
150 }
151
152 private MessageConsumer createJMSMessageConsumer() throws MuleException, JMSException
153 {
154 InboundEndpoint endpoint =
155 muleContext.getEndpointFactory().getInboundEndpoint("jms://out");
156 JmsConnector jmsConnector = (JmsConnector) muleContext.getRegistry().lookupConnector("jmsConnector");
157 JmsSupport jmsSupport = jmsConnector.getJmsSupport();
158 MessageConsumer consumer = jmsSupport.createConsumer(jmsConnector.getSession(endpoint),
159 jmsSupport.createDestination(jmsConnector.getSession(endpoint), endpoint), false, endpoint);
160 return consumer;
161 }
162
163
164
165
166
167
168 private synchronized void assertNoLostMessages(int numMessages, Service service,
169 TestJMSMessageListener listener) throws ResourceManagerSystemException
170 {
171 QueueSession queueSession = getTestQueueSession();
172 Queue serviceQueue = queueSession.getQueue(service.getName() + ".service");
173 int queueSize = serviceQueue.size();
174
175 logger.warn("SEDA Queue: " + queueSize + ", Outbound JMS consumer: " +
176 (NUM_MESSAGES - listener.countdownLatch.getCount()));
177 assertEquals(numMessages, (NUM_MESSAGES - listener.countdownLatch.getCount()) + queueSize);
178 }
179
180 protected void assertOutboundQueueEmpty(TestJMSMessageListener listener)
181 {
182 assertEquals(500, listener.countdownLatch.getCount());
183 }
184
185 private class TestJMSMessageListener implements MessageListener
186 {
187 public TestJMSMessageListener()
188 {
189 super();
190 }
191
192 CountDownLatch countdownLatch = new CountDownLatch(ServiceInFlightMessagesJMSTestCase.NUM_MESSAGES);
193
194 public void onMessage(Message message)
195 {
196 countdownLatch.countDown();
197 }
198 }
199 }