L.S., Perhaps I'm missing something in that code snippet, but I don't see the place in the bean's code where the incoming exchange is being answered with a DONE. The exchanges that being sent from the component seem to be handled OK.
You should probably be looking for a missing DONE exchange for the InOnly exchanges that are sent by the static-recipient-list to the orderBean and archiveBean. Regards, Gert Vanthienen ------------------------ Open Source SOA: http://fusesource.com Blog: http://gertvanthienen.blogspot.com/ 2009/11/30 atr <[email protected]>: > > Hello. > > I have a problem with a file:poller based transformation: My incoming file > won't be deleted while processing. > Why the file will not be deleted? > I use Servicemix 3.3.. Below you'll find my configurations and also my > transformation Java-Bean. > I have no errors in my log file and the transformation is done well. > > By the way, I have migrated from Servicemix 3.2.2 to Version 3.3 and changed > in the xbean.xml-Heead the version of XSD-Schema for servicemix-file and > servicemix-eip. But this change does not solve the problem. > > Her you find my code: > > File-Poller-XBean > ============================================== > ============================================== > <beans xmlns:file="http://servicemix.apache.org/file/1.0" > xmlns:sportscheck="http://sportscheck.com/services/orders" > xmlns="http://www.springframework.org/schema/beans" > xmlns:xsi="http://http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://servicemix.apache.org/file/1.0 > http://servicemix.apache.org/schema/servicemix-file-2008.01.xsd > http://www.springframework.org/schema/beans > http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> > > > <file:poller service="sportscheck:OrdersInProduction" > endpoint="endpoint" > targetService="sportscheck:eip" > file="${demandware.export.production.orders}" > recursive="true" > period="${orders.dw.export.210.filepoller}" > filter="#XMLFilter" > deleteFile="true"> > </file:poller> > > <file:sender service="sportscheck:OrdersOutProduction" > endpoint="endpoint" > directory="${baur.import.production.orders}"> > </file:sender> > > <file:poller service="sportscheck:OrdersInTest" > endpoint="endpoint" > targetService="sportscheck:eip" > file="${demandware.export.test.orders}" > recursive="true" > period="${orders.dw.export.210.filepoller}" > filter="#XMLFilter"> > </file:poller> > > <file:sender service="sportscheck:OrdersOutTest" > endpoint="endpoint" > directory="${baur.import.test.orders}"> > </file:sender> > > <file:sender service="sportscheck:archive" > endpoint="endpoint" > directory="${archive.orders}"> > </file:sender> > <bean id="propertyConfigurer" > class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> > <property name="locations"> > <list> > <value>classpath:pathes.properties</value> > <value>classpath:my.properties</value> > </list> > </property> > </bean> > > <bean id="XMLFilter" > class="de.mmsdresden.sportscheck.utils.RecursiveFileFilter"> > <constructor-arg value=".xml" /> > </bean> > </beans> > > > EIP-XBean > ============================================== > ============================================== > <beans xmlns:eip="http://servicemix.apache.org/eip/1.0" > xmlns:sportscheck="http://sportscheck.com/services/orders" > xmlns="http://www.springframework.org/schema/beans" > xmlns:xsi="http://http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://servicemix.apache.org/eip/1.0 > > http://servicemix.apache.org/schema/servicemix-bean-2008.01.xsd > http://www.springframework.org/schema/beans > > http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> > > <eip:static-recipient-list service="sportscheck:eip" > endpoint="endpoint"> > <eip:recipients> > <eip:exchange-target service="sportscheck:orderBean" > /> > <eip:exchange-target > service="sportscheck:archiveBean" /> > </eip:recipients> > </eip:static-recipient-list> > > </beans> > > > Bean-XBean > ============================================== > ============================================== > <beans xmlns="http://www.springframework.org/schema/beans" > xmlns:bean="http://servicemix.apache.org/bean/1.0" > xmlns:sportscheck="http://sportscheck.com/services/orders" > xmlns:xsi="http://http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://servicemix.apache.org/bean/1.0 > http://servicemix.apache.org/schema/servicemix-bean-2008.01.xsd > http://www.springframework.org/schema/beans > http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> > > <bean:endpoint service="sportscheck:orderBean" > endpoint="endpoint" bean="#OrderBean" /> > > <bean id="OrderBean" > class="de.mmsdresden.sportscheck.beans.OrderBean" /> > > <bean:endpoint service="sportscheck:archiveBean" > endpoint="endpoint" bean="#ArchiveBean" /> > > <bean id="ArchiveBean" > class="de.mmsdresden.sportscheck.beans.ArchiveBean" /> > > </beans> > > > Java-Bean > ============================================== > ============================================== > package de.mmsdresden.sportscheck.beans; > > import java.io.ByteArrayInputStream; > import java.io.File; > import java.io.FileNotFoundException; > import java.io.IOException; > import java.util.HashMap; > import java.util.LinkedList; > import java.util.List; > import java.util.Map; > import java.util.Properties; > > import javax.annotation.PostConstruct; > import javax.annotation.Resource; > import javax.jbi.component.ComponentContext; > import javax.jbi.messaging.DeliveryChannel; > import javax.jbi.messaging.ExchangeStatus; > import javax.jbi.messaging.InOnly; > import javax.jbi.messaging.MessageExchange; > import javax.jbi.messaging.MessagingException; > import javax.jbi.messaging.NormalizedMessage; > import javax.jbi.messaging.MessageExchange.Role; > import javax.xml.transform.TransformerConfigurationException; > import javax.xml.transform.TransformerException; > import javax.xml.transform.stream.StreamResult; > import javax.xml.transform.stream.StreamSource; > > import org.apache.commons.logging.Log; > import org.apache.commons.logging.LogFactory; > import org.apache.servicemix.MessageExchangeListener; > import org.apache.servicemix.client.ServiceMixClientFacade; > import org.apache.servicemix.components.util.DefaultFileMarshaler; > import org.apache.servicemix.jbi.api.Destination; > import org.apache.servicemix.jbi.api.ServiceMixClient; > import org.jdom.Document; > import org.jdom.Element; > import org.jdom.JDOMException; > import org.jdom.input.SAXBuilder; > import org.jdom.output.XMLOutputter; > import org.milyn.payload.JavaResult; > import org.xml.sax.SAXException; > > import de.mmsdresden.sportscheck.pojos.orders.bfs.output.BFSBusinessCase; > import de.mmsdresden.sportscheck.pojos.orders.demandware.input.Order; > import de.mmsdresden.sportscheck.utils.FileNameUtils; > import de.mmsdresden.sportscheck.utils.Mail; > import de.mmsdresden.sportscheck.utils.MessageExchangeCache; > import de.mmsdresden.sportscheck.utils.MessageExchangeCacheImpl; > import de.mmsdresden.sportscheck.utils.OrderTransformator; > import de.mmsdresden.sportscheck.utils.ServiceMixUtils; > import de.mmsdresden.sportscheck.utils.SmooksWrapper; > import de.mmsdresden.sportscheck.utils.XMLUtils; > import de.mmsdresden.sportscheck.utils.properties.PropertyLoader; > import > de.mmsdresden.sportscheck.utils.properties.factories.FilenamePropertyFactory; > import > de.mmsdresden.sportscheck.utils.properties.factories.MailPropertyFactory; > > /** > * DW -> BFS Order Mapping > * > * @author Andreas Trappe > * @author Andreas Lutz > * @since 13.07.2009 > */ > > public class OrderBean implements MessageExchangeListener { > /** > * @see javax.jbi.messaging.DeliveryChannel > */ > �...@resource > private DeliveryChannel channel; > > /** > * @see javax.jbi.component.ComponentContext > */ > �...@resource > private ComponentContext context; > > /** > * @see org.apache.servicemix.client.ServiceMixClient > */ > private ServiceMixClient client; > > private Destination fileoutProduction; > > private Destination fileoutTest; > > private static Log LOGGER = LogFactory.getLog(OrderBean.class); > > private static final String SERVICE_NAMESPACE = > "service:http://sportscheck.com/services/orders/"; > > private static final String FILEOUT_PRODUCTION_ENDPOINT = > SERVICE_NAMESPACE + "OrdersOutProduction"; > > private static final String FILEOUT_TEST_ENDPOINT = > SERVICE_NAMESPACE + "OrdersOutTest"; > > private static final String SMOOKS_ORDER_INPUT_CONF = > "smooks_conf/orders_dmware_input.xml"; > > private static final String SMOOKS_ORDER_OUTPUT_CONF = > "smooks_conf/orders_bfs_output.xml"; > > private MessageExchangeCache exchangeCache = new > MessageExchangeCacheImpl(); > > private PropertyLoader propsFilename = null; > > private String fileInName; > > private String fileOutName; > > private static final String PROPERTIES_PATH_TEST = > "baur.import.test.orders"; > > private static final String PROPERTIES_PATH_PRODUCTION = > "baur.import.production.orders"; > > private static final String DEFAULT_XSL_PATH = > "sportscheck_conf/XSL/"; > > private static final String DW_XSL = "DW/dw_orders.xsl"; > > private static String GLOBAL_ERROR; > > private static String GLOBAL_PROCESS_INVALID_FILES; > > static javax.xml.transform.TransformerFactory factory = > javax.xml.transform.TransformerFactory.newInstance(); > > // some Mail constants // > private static String MAIL_SENDMAIL; > > private static String MAIL_SENDER; > > private static String MAIL_RECEIVERS; > > private static String[] MAIL_RECEIVERS_ARRAY; > > private static Mail MAIL; > > private static PropertyLoader props = null; > static { > try { > props = new > MailPropertyFactory().getImplementation(); > } catch (FileNotFoundException e) { > LOGGER.error(e); > } catch (IOException e) { > LOGGER.error(e); > } > GLOBAL_PROCESS_INVALID_FILES = > props.getValue("global.processInvalidFiles"); > MAIL = new Mail(); > MAIL.setSmtpHost(props.getValue("smtp_host"), > props.getValue("smtp_user"), props.getValue("smtp_pass")); > MAIL_SENDMAIL = > props.getValue("esb.orders.validateGeneratedXML.invalid.sendmail"); > } > > /** > * This init method checks that the needed artifacts are initialized > * > * @throws IOException > * @throws FileNotFoundException > * @throws MessagingException > */ > �...@postconstruct > public void init() throws FileNotFoundException, IOException, > MessagingException { > if (this.context == null || this.channel == null) { > throw new IllegalStateException("Bean not > initialized"); > } > this.propsFilename = new > FilenamePropertyFactory().getImplementation(); > this.fileOutName = this.propsFilename.getValue("orders"); > > /* > * Create client to get the destination (where to send the > files) > */ > this.client = new ServiceMixClientFacade(this.context); > > this.fileoutProduction = > this.client.createDestination(FILEOUT_PRODUCTION_ENDPOINT); > this.fileoutTest = > this.client.createDestination(FILEOUT_TEST_ENDPOINT); > > > LOGGER.info("-----------------------------------------------"); > LOGGER.info("--------- Order mapping initialized > -----------"); > > LOGGER.info("-----------------------------------------------"); > LOGGER.info("-> For more informations turn on debug > logging."); > } > > /* > * (non-Javadoc) > * > * @see > * > org.apache.servicemix.MessageExchangeListener#onMessageExchange(javax > * .jbi.messaging.MessageExchange) > */ > public synchronized void onMessageExchange(MessageExchange exchange) > throws MessagingException { > LOGGER.debug("Received Exchange: " + > exchange.getExchangeId()); > > if (exchange.getRole().equals(Role.CONSUMER)) { > if > (this.exchangeCache.containsKey(exchange.getExchangeId())) { > boolean done = true; > boolean error = false; > LOGGER.debug("Exchange has status: " + > exchange.getStatus()); > if > (exchange.getStatus().equals(ExchangeStatus.ACTIVE)) > done = false; > if > (exchange.getStatus().equals(ExchangeStatus.ERROR)) > error = true; > if (done && !error) { > LOGGER.debug("Setting exchange: " + > exchange.getExchangeId() + " to DONE!"); > > ServiceMixUtils.sendMessage(exchange, ExchangeStatus.DONE, this.channel); > > this.exchangeCache.removeFromCache(exchange.getExchangeId()); > } > } > } else { > try { > process(exchange); > } catch (IOException e) { > LOGGER.error(e); > } catch (SAXException e) { > LOGGER.error(e); > } catch (TransformerException e) { > LOGGER.error(e); > } > } > LOGGER.debug("Exchanges in cache: " + > this.exchangeCache.size()); > } > > private void process(MessageExchange exchange) throws > TransformerException, IOException, SAXException, MessagingException { > // process message // > InOnly inExchange = (InOnly) exchange; > NormalizedMessage message = inExchange.getInMessage(); > String filePath = (String) > message.getProperty(DefaultFileMarshaler.FILE_PATH_PROPERTY); > this.fileInName = (String) > message.getProperty(DefaultFileMarshaler.FILE_NAME_PROPERTY); > StreamSource content = > ServiceMixUtils.getMessagePayload(message); > LOGGER.info("Processing Exchange Message, with file name " + > fileInName); > > // fix DW XML (Smooks only works with unique tag-ids) // > LOGGER.info("Fixing DW XML file ..."); > content = fixedXML(content); > > // get XML into JAVA // > LOGGER.info("Mapping XML to Java ..."); > List<Order> in_orders = xmlTojava(content); > > // process JAVA with business logic > LOGGER.info("Processing Java to Java ..."); > LinkedList<BFSBusinessCase> transformedOrders = > javaTojava(in_orders); > > // create XML from JAVA // > LOGGER.info("Creating XML from Java ..."); > StreamResult out = javaToxml(transformedOrders); > > // validate generated xml // > LOGGER.info("Validating generated XML ..."); > boolean isvalid = validate(filePath, out); > if (!isvalid && MAIL_SENDMAIL.equals("1")) { > sendErrorMail(filePath); > } > > // ouput XML // > if (isvalid || (!isvalid && > GLOBAL_PROCESS_INVALID_FILES.equals("1"))) > outputToFile(filePath, out); > > // Done // > LOGGER.info("Done processing exchange message ..."); > } > > private StreamSource fixedXML(StreamSource content) throws > IOException, TransformerConfigurationException, FileNotFoundException { > SAXBuilder sb = new SAXBuilder(); > try { > Document doc = sb.build(content.getInputStream()); > Element root = doc.getRootElement(); > Element transformed = XMLUtils.modifyXML(root, > System.getProperty("user.dir") + File.separator + DEFAULT_XSL_PATH + > DW_XSL); > > XMLOutputter xo = new XMLOutputter(); > // xo.output(transformed, new > FileWriter("c:\\test.xml")); > return new StreamSource(new > ByteArrayInputStream(xo.outputString(transformed).getBytes())); > > } catch (JDOMException e) { > LOGGER.error("Error parsing XML JDOM - " + e); > return null; > } > } > > private StreamResult javaToxml(LinkedList<BFSBusinessCase> > transformedOrders) throws IOException, SAXException { > SmooksWrapper xmlMapper = SmooksWrapper.getInstance(); > Map<String, Object> outObjects = new HashMap<String, > Object>(); > outObjects.put("transformedOrders", transformedOrders); > StreamResult out = > xmlMapper.mapJavaToXML(SMOOKS_ORDER_OUTPUT_CONF, outObjects); > return out; > } > > private LinkedList<BFSBusinessCase> javaTojava(List<Order> > in_orders) { > OrderTransformator transformer = new > OrderTransformator(in_orders, true, fileInName); > transformer.transform(); > LinkedList<BFSBusinessCase> transformedOrders = > transformer.getResult(); > return transformedOrders; > } > > �...@suppresswarnings("unchecked") > private List<Order> xmlTojava(StreamSource content) throws > IOException, SAXException { > SmooksWrapper xmlMapper = SmooksWrapper.getInstance(); > JavaResult result = > xmlMapper.mapXMLtoJava(SMOOKS_ORDER_INPUT_CONF, content); > List<Order> in_orders = (LinkedList<Order>) > result.getBean("orders"); > return in_orders; > } > > private boolean validate(String filePath, StreamResult out) { > String path = null; > if (ServiceMixUtils.isTestDir(filePath)) > path = PROPERTIES_PATH_TEST; > else > path = PROPERTIES_PATH_PRODUCTION; > try { > XMLUtils.validateXML(out.getOutputStream(), path); > } catch (Exception e) { > LOGGER.error("Exception: " + e); > GLOBAL_ERROR = e.getMessage(); > return false; > } > return true; > } > > private void sendErrorMail(String filePath) { > MAIL_SENDER = > props.getValue("esb.orders.validateGeneratedXML.invalid.sender"); > MAIL_RECEIVERS = > props.getValue("esb.orders.validateGeneratedXML.invalid.receivers"); > // split receivers // > if (MAIL_RECEIVERS.indexOf("|") > -1) { > MAIL_RECEIVERS_ARRAY = MAIL_RECEIVERS.split("\\|"); > } else { > MAIL_RECEIVERS_ARRAY = new String[1]; > MAIL_RECEIVERS_ARRAY[0] = new > String(MAIL_RECEIVERS); > } > MAIL.setContent(MAIL_SENDER, "Error while validating > generated Baur order file"); > MAIL.addRecipients(MAIL_RECEIVERS_ARRAY); > MAIL.addText("Error validating " + filePath + ":"); > MAIL.addText(GLOBAL_ERROR); > if (!MAIL.sendMail()) { > LOGGER.error("Could not sent mail.\r\n Error: " + > MAIL.lastError); > } > } > > private void outputToFile(String filePath, StreamResult out) throws > MessagingException, IOException { > LOGGER.info("Saving XML to Filesystem ..."); > > MessageExchange[] exchanges = null; > > if (ServiceMixUtils.isTestDir(filePath)) { > exchanges = new MessageExchange[1]; > > // fileout test copy // > Properties fileOutProps = new Properties(); > String fileOutTotal = > FileNameUtils.getOutFilenameWithUniqueKey(this.fileOutName, fileInName, > ".xml"); > > fileOutProps.put(DefaultFileMarshaler.FILE_NAME_PROPERTY, fileOutTotal); > exchanges[0] = > ServiceMixUtils.sendMessage(this.fileoutTest, out, fileOutProps, > this.client); > LOGGER.debug("Exchange created: " + > exchanges[0].getExchangeId() + ", with file name " + fileOutTotal); > > } else { > exchanges = new MessageExchange[1]; > > // fileout production copy // > Properties fileOutProps = new Properties(); > String fileOutTotal = > FileNameUtils.getOutFilenameWithUniqueKey(this.fileOutName, fileInName, > ".xml"); > > fileOutProps.put(DefaultFileMarshaler.FILE_NAME_PROPERTY, fileOutTotal); > exchanges[0] = > ServiceMixUtils.sendMessage(this.fileoutProduction, out, fileOutProps, > this.client); > LOGGER.debug("Exchange created - Production file: " > + exchanges[0].getExchangeId() + ", with file name " + fileOutTotal); > } > } > } > -- > View this message in context: > http://old.nabble.com/%3Cfile%3Apolller%3E-does-not-delete-files-after-processing-tp26574819p26574819.html > Sent from the ServiceMix - User mailing list archive at Nabble.com. > >
