View Javadoc

1   /*
2    * $Id: ServiceInFlightMessagesJMSTestCase.java 19191 2010-08-25 21:05:23Z tcarlson $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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          // Seda queue is empty because queue is not persistent and therefore is
53          // emptied when service is stopped
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          // All message were lost so both queues are empty.
67          assertSedaQueueEmpty(service);
68          // TODO Enable the following assertion once MULE-4072 is fixed
69          // assertOutboundQueueEmpty(listener);
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          // Persistent queue is being used so seda queue is not emptied when the service is stopped
82          assertSedaQueueNotEmpty(service);
83  
84          // Start, process some messages, stop and make sure no messages get lost.
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          // TODO Enable the following assertion once MULE-4072 is fixed
93          // assertOutboundQueueEmpty(listener);
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         // Paused service does not process messages before or during stop().
107         assertNoLostMessages(NUM_MESSAGES, service, listener);
108 
109         // Start, process some messages, stop and make sure no messages get lost.
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         // Dispose and restart Mule and let it run for a short while
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.getRegistry().lookupEndpointFactory().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      * After each run the following should total 500 events: 1) Event still in SEDA
165      * queue 2) Events dispatched to outbound vm endpooint 3) Events that were unable
166      * to be sent to stopped service and raised exceptions
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 }