/* * Copyright (c) 2014 Red Hat, Inc. and/or its affiliates. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Cheng Fang - Initial API and implementation */ package org.jberet.support.io; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.TimeUnit; import javax.batch.operations.JobOperator; import javax.batch.runtime.BatchRuntime; import javax.batch.runtime.BatchStatus; import javax.jms.ConnectionFactory; import javax.jms.Queue; import org.apache.activemq.artemis.api.core.TransportConfiguration; import org.apache.activemq.artemis.core.config.Configuration; import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl; import org.apache.activemq.artemis.core.remoting.impl.netty.NettyAcceptorFactory; import org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory; import org.apache.activemq.artemis.jms.server.config.ConnectionFactoryConfiguration; import org.apache.activemq.artemis.jms.server.config.JMSConfiguration; import org.apache.activemq.artemis.jms.server.config.JMSQueueConfiguration; import org.apache.activemq.artemis.jms.server.config.impl.ConnectionFactoryConfigurationImpl; import org.apache.activemq.artemis.jms.server.config.impl.JMSConfigurationImpl; import org.apache.activemq.artemis.jms.server.config.impl.JMSQueueConfigurationImpl; import org.apache.activemq.artemis.jms.server.embedded.EmbeddedJMS; import org.jberet.runtime.JobExecutionImpl; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class JmsReaderWriterTest { private static final JobOperator jobOperator = BatchRuntime.getJobOperator(); static final String writerTestJobName = "org.jberet.support.io.JmsWriterTest.xml"; static final String readerTestJobName = "org.jberet.support.io.JmsReaderTest.xml"; static final String destinationLookupName = "/queue/queue1"; static final String connectionFactoryLookupName = "/cf"; protected static EmbeddedJMS jmsServer; static final String ibmStockTradeExpected1_10 = "09:30, 67040, 09:31, 10810, 09:39, 2500"; static final String ibmStockTradeForbid1_10 = "09:40"; static final String ibmStockTradeCellProcessorsDateAsString = "null; null; ParseDouble; ParseDouble; ParseDouble; ParseDouble; ParseDouble"; @BeforeClass public static void beforeClass() throws Exception { // Step 1. Create HornetQ core configuration, and set the properties accordingly final Configuration configuration = new ConfigurationImpl(); configuration.setPersistenceEnabled(false); configuration.setJournalDirectory("target/data/journal"); configuration.setSecurityEnabled(false); configuration.getAcceptorConfigurations() .add(new TransportConfiguration(NettyAcceptorFactory.class.getName())); final TransportConfiguration connectorConfig = new TransportConfiguration(NettyConnectorFactory.class.getName()); configuration.getConnectorConfigurations().put("connector", connectorConfig); // Step 2. Create the JMS configuration final JMSConfiguration jmsConfig = new JMSConfigurationImpl(); // Step 3. Configure the JMS ConnectionFactory final ArrayList<String> connectorNames = new ArrayList<String>(); connectorNames.add("connector"); final ConnectionFactoryConfiguration cfConfig = new ConnectionFactoryConfigurationImpl().setName("cf") .setConnectorNames(connectorNames).setBindings(connectionFactoryLookupName); jmsConfig.getConnectionFactoryConfigurations().add(cfConfig); // Step 4. Configure the JMS Queue final JMSQueueConfiguration queueConfig = new JMSQueueConfigurationImpl().setName("queue1") .setDurable(false).setBindings(destinationLookupName); jmsConfig.getQueueConfigurations().add(queueConfig); // Step 5. Start the JMS Server using the HornetQ core server and the JMS configuration jmsServer = new EmbeddedJMS(); jmsServer.setConfiguration(configuration); jmsServer.setJmsConfiguration(jmsConfig); jmsServer.start(); System.out.println("Started Embedded JMS Server"); // Step 6. Lookup JMS resources defined in the configuration MessagingResourceProducer.connectionFactory = (ConnectionFactory) jmsServer.lookup(connectionFactoryLookupName); MessagingResourceProducer.queue = (Queue) jmsServer.lookup(destinationLookupName); } @AfterClass public static void afterClass() throws Exception { if (jmsServer != null) { jmsServer.stop(); } } @Test public void readIBMStockTradeCsvWriteJmsBeanType() throws Exception { testWrite0(writerTestJobName, StockTrade.class, ExcelWriterTest.ibmStockTradeHeader, ExcelWriterTest.ibmStockTradeCellProcessors, "1", "10"); // CsvItemReaderWriter uses header "Date, Time, Open, ..." // CsvItemReaderWriter has nameMapping "date, time, open, ..." to match java fields in StockTrade. CsvItemReaderWriter // does not understand Jackson mapping annotations in POJO. testRead0(readerTestJobName, StockTrade.class, "readIBMStockTradeCsvWriteJmsBeanType.out", ExcelWriterTest.ibmStockTradeNameMapping, ExcelWriterTest.ibmStockTradeHeader, ibmStockTradeExpected1_10, ibmStockTradeForbid1_10); } @Test public void readIBMStockTradeCsvWriteJmsMapType() throws Exception { testWrite0(writerTestJobName, Map.class, ExcelWriterTest.ibmStockTradeHeader, ibmStockTradeCellProcessorsDateAsString, "1", "10"); testRead0(readerTestJobName, Map.class, "readIBMStockTradeCsvWriteJmsMapType.out", ExcelWriterTest.ibmStockTradeNameMapping, ExcelWriterTest.ibmStockTradeHeader, ibmStockTradeExpected1_10, ibmStockTradeForbid1_10); } @Test public void readIBMStockTradeCsvWriteJmsListType() throws Exception { testWrite0(writerTestJobName, List.class, ExcelWriterTest.ibmStockTradeHeader, ExcelWriterTest.ibmStockTradeCellProcessors, "1", "10"); testRead0(readerTestJobName, List.class, "readIBMStockTradeCsvWriteJmsListType.out", ExcelWriterTest.ibmStockTradeNameMapping, ExcelWriterTest.ibmStockTradeHeader, ibmStockTradeExpected1_10, ibmStockTradeForbid1_10); } static void testWrite0(final String jobName, final Class<?> beanType, final String csvNameMapping, final String cellProcessors, final String start, final String end) throws Exception { final Properties params = CsvItemReaderWriterTest.createParams(CsvProperties.BEAN_TYPE_KEY, beanType.getName()); if (csvNameMapping != null) { params.setProperty("nameMapping", csvNameMapping); } if (cellProcessors != null) { params.setProperty("cellProcessors", cellProcessors); } if (start != null) { params.setProperty("start", start); } if (end != null) { params.setProperty("end", end); } //params.setProperty("connectionFactoryLookupName", connectionFactoryLookupName); //params.setProperty("destinationLookupName", destinationLookupName); final long jobExecutionId = jobOperator.start(jobName, params); final JobExecutionImpl jobExecution = (JobExecutionImpl) jobOperator.getJobExecution(jobExecutionId); jobExecution.awaitTermination(CsvItemReaderWriterTest.waitTimeoutMinutes, TimeUnit.HOURS); Assert.assertEquals(BatchStatus.COMPLETED, jobExecution.getBatchStatus()); } static void testRead0(final String jobName, final Class<?> beanType, final String writeResource, final String csvNameMapping, final String csvHeader, final String expect, final String forbid) throws Exception { final Properties params = CsvItemReaderWriterTest.createParams(CsvProperties.BEAN_TYPE_KEY, beanType.getName()); final File writeResourceFile; if (writeResource != null) { writeResourceFile = new File(CsvItemReaderWriterTest.tmpdir, writeResource); params.setProperty("writeResource", writeResourceFile.getPath()); } else { throw new RuntimeException("writeResource is null"); } if (csvNameMapping != null) { params.setProperty("nameMapping", csvNameMapping); } if (csvHeader != null) { params.setProperty("header", csvHeader); } final long jobExecutionId = jobOperator.start(jobName, params); final JobExecutionImpl jobExecution = (JobExecutionImpl) jobOperator.getJobExecution(jobExecutionId); jobExecution.awaitTermination(CsvItemReaderWriterTest.waitTimeoutMinutes, TimeUnit.HOURS); Assert.assertEquals(BatchStatus.COMPLETED, jobExecution.getBatchStatus()); CsvItemReaderWriterTest.validate(writeResourceFile, expect, forbid); } }