| /* |
| * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0, which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * This Source Code may also be made available under the following Secondary |
| * Licenses when the conditions for such availability set forth in the |
| * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, |
| * version 2 with the GNU Classpath Exception, which is available at |
| * https://www.gnu.org/software/classpath/license.html. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 |
| */ |
| |
| package com.sun.s1asdev.ejb.mdb.singleton.client; |
| |
| import java.util.*; |
| import javax.naming.*; |
| import jakarta.jms.*; |
| import jakarta.annotation.*; |
| import jakarta.ejb.*; |
| import com.sun.s1asdev.ejb.mdb.singleton.FooRemoteIF; |
| import com.sun.ejte.ccl.reporter.SimpleReporterAdapter; |
| |
| /** |
| * Tests for http://java.net/jira/browse/GLASSFISH-13004 (Support MDB singleton). |
| * The test ejb jar is configured with property singleton-bean-pool=true in |
| * sun-ejb-jar.xml. This test client calls fooTest and doTest(...): |
| * fooTest: verify the stateless bean FooBean is single instance; |
| * doTest(..): verify the mdb MessageBean is single instance. |
| */ |
| public class Client { |
| |
| private static SimpleReporterAdapter stat = |
| new SimpleReporterAdapter("appserv-tests"); |
| |
| public static void main (String[] args) { |
| Client client = new Client(args); |
| |
| stat.addDescription("ejb-mdb-singleton"); |
| client.doTest(); |
| stat.printSummary("ejb-mdb-singletonID"); |
| System.exit(0); |
| } |
| |
| private InitialContext context; |
| private QueueConnection queueCon; |
| private QueueSession queueSession; |
| private QueueSender queueSender; |
| private QueueReceiver queueReceiver; |
| private jakarta.jms.Queue clientQueue; |
| |
| private int numMessages = 1; |
| private int numOfCalls = 120; |
| |
| @EJB |
| private static FooRemoteIF foo; |
| |
| public Client(String[] args) { |
| |
| if( args.length == 1 ) { |
| numMessages = new Integer(args[0]).intValue(); |
| } |
| } |
| |
| public void doTest() { |
| try { |
| setup(); |
| doTest("jms/ejb_mdb_singleton_InQueue", numMessages); |
| fooTest(); |
| stat.addStatus("singleton main", stat.PASS); |
| } catch(Throwable t) { |
| stat.addStatus("singleton main", stat.FAIL); |
| t.printStackTrace(); |
| } finally { |
| cleanup(); |
| } |
| } |
| |
| public void fooTest() { |
| final Set<String> fooBeans = Collections.synchronizedSet(new HashSet<String>()); |
| Thread[] threads = new Thread[numOfCalls]; |
| for (int i = 0; i < threads.length; i++) { |
| threads[i] = new Thread(new Runnable() { |
| public void run() { |
| fooBeans.add(foo.foo()); |
| } |
| }); |
| threads[i].start(); |
| } |
| |
| for (int i = 0; i < threads.length; i++) { |
| try { |
| threads[i].join(); |
| } catch (InterruptedException e) { |
| } |
| } |
| verifySingleInstance(fooBeans); |
| } |
| |
| public void setup() throws Exception { |
| context = new InitialContext(); |
| QueueConnectionFactory queueConFactory = (QueueConnectionFactory) context.lookup ("java:comp/env/FooCF"); |
| queueCon = queueConFactory.createQueueConnection(); |
| queueSession = queueCon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); |
| queueSender = queueSession.createSender(null); |
| queueCon.start(); |
| } |
| |
| public void cleanup() { |
| try { |
| if( queueCon != null ) { |
| queueCon.close(); |
| } |
| } catch(Throwable t) { |
| t.printStackTrace(); |
| } |
| } |
| |
| public void sendMsgs(jakarta.jms.Queue queue, Message msg, int num) |
| throws JMSException { |
| for(int i = 0; i < num; i++) { |
| //System.out.println("Sending message " + i + " to " + queue + |
| // " at time " + System.currentTimeMillis()); |
| queueSender.send(queue, msg); |
| // System.out.println("Sent message " + i + " to " + queue + |
| // " at time " + System.currentTimeMillis()); |
| } |
| } |
| |
| public void doTest(String destName, int num) throws Exception { |
| Destination dest = (Destination) context.lookup(destName); |
| |
| for(int i = 0; i < numOfCalls; i++) { |
| Message message = queueSession.createTextMessage(destName); |
| // Message message = topicSession.createTextMessage(destName); |
| message.setBooleanProperty("flag", true); |
| message.setIntProperty("num", i); |
| sendMsgs((jakarta.jms.Queue) dest, message, num); |
| } |
| |
| List<String> messageBeanInstances = new ArrayList<String>(); |
| int trials = 0; |
| do { |
| try { |
| Thread.sleep(1000); |
| } catch (InterruptedException e) { |
| } |
| messageBeanInstances = foo.getMessageBeanInstances(); |
| ++trials; |
| } while (messageBeanInstances.size() < numOfCalls && trials < 5); |
| |
| if(messageBeanInstances.size() <= 1 || messageBeanInstances.size() < numOfCalls) { |
| throw new RuntimeException("Expecting number of instances " + numOfCalls + ", but got " + |
| messageBeanInstances.size() + ": " + messageBeanInstances); |
| } |
| Set<String> messageBeanInstancesUnique = new HashSet<String>(messageBeanInstances); |
| verifySingleInstance(messageBeanInstancesUnique); |
| } |
| |
| private void verifySingleInstance(Collection<String> c) { |
| if (c.size() == 1) { |
| System.out.println("Got expected instances (single one): " + c); |
| } else { |
| throw new RuntimeException("Expecting single instance, but got " + c); |
| } |
| } |
| } |
| |