text:
By Arnaud Cogoluegnes, Thierry Templier, Gary Gregory, Olivier Bazoud, authors of Spring Batch in Action
Batch applications are a challenge to write, and that's why Spring Batch was created: to make them easier to write but also faster, more robust, and reliable. Batch applications process large amounts of data without human intervention. You'd opt to use batch applications to compute data for generating monthly financial statements, calculating statistics, and indexing files. This article, based on chapter 1 of Spring Batch in Action, implements a real-world Spring Batch job. By the end of this article, you'll have an overview of what Spring Batch does, and you'll be ready to implement your first job with Spring Batch. Let's get started with batch applications!
This article introduces a real application that illustrates the use of Spring Batch: an online store application. This use case starts out small and simple but remains realistic in terms of technical requirements. It not only demonstrates Spring Batch features but also illustrates how this use case fits into the enterprise landscape.
By implementing this use case using Spring Batch, you gain a practical understanding of the framework: how it implements efficient reading and writing of large volumes of data, when to use built-in components, when to implement your own components, how to configure a batch job with the Spring lightweight container, and much more. By the end of this article, you'll have a good overview of how Spring Batch works.
The ACME Corporation wants to expand its business by selling its products on the web. To do so, ACME chooses to build a dedicated online store application. ACME will use batch jobs to populate the online store database with the catalog from its internal proprietary system, as shown in figure 1. The system will process data every night to insert new products in the catalog or update existing products.
Figure 1 Thanks to this new application, anyone can buy ACME's products online. The system sends catalogs to a server where a batch process reads them and writes product records into the online store database.
That's it for the big picture, but you should understand why ACME decided to build an online store in the first place and populate it using batch processes.
Why did ACME choose to build an online, web-based application to sell its products? As we mentioned, this is the best way for ACME to expand its business and to serve more customers. Web applications are easy to deploy, easy to access, and can provide a great user experience. ACME plans to deploy the online store application to a local web hosting provider rather than hosting it on its own network. The first version of the online store will provide a simple but efficient UI; ACME focuses on the catalog and transactions first, before providing more features and a more elaborate UI.
Next, why did ACME choose to shuttle data from one system to the other instead of making its onsite catalog and the online store communicate directly? The software that powers the catalog has an API, so why not use it? The main reason is security: as illustrated in figure 2, ACME's own network hosts the catalog system, and the company doesn't want to expose the catalog system to the outside world directly, even via another application. This precaution is rather drastic, but that's how things are done at ACME.
Figure 2 Because ACME doesn't want its internal catalog system to be directly accessible from the outside world, it doesn't allow the two applications to communicate directly and exchange data.
Another reason for this architecture is that the catalog system's API and data format don't suit the needs of the online store application: ACME wants to show a summarized view of the catalog data to customers without overwhelming them with a complex catalog structure and supplying too many details. You could get this summarized catalog view by using the catalog system's API, but you'd need to make many calls, which would cause performance to suffer in the catalog system.
To summarize, a mismatch exists between the view of the data provided by the catalog system and the view of the data required by the online store application. Therefore, an application needs to process the data before exposing it to customers through the online store.
The online store application scenario is a good example of two systems communicating to exchange data. ACME updates the catalog system throughout the day, adding new products and updating existing products. The online store application doesn't need to expose live data because buyers can live with day-old catalog information.
Figure 3 An extract, transform, and load (ETL) process extracts and transforms the catalog system data into a flat file, which ACME sends every night to a Spring Batch process. This Spring Batch process is in charge of reading the flat file and importing the data into the online store database.
Therefore, a nightly batch process updates the online store database, using flat files, as shown in figure 3.
Extract, transform, and load (ETL)
Briefly stated, ETL is a process in the database and data-warehousing world that performs the following steps:
- Extracts data from an external data source
- Transforms the extracted data to match a specific purpose
- Loads the transformed data into a data target: a database or data warehouse
Many products, both free and commercial, can help create ETL processes. This is a bigger topic than we can address here, but it isn't always as simple as these three steps. Writing an ETL process can present its own set of challenges involving parallel processing, rerunnability, and recoverability. The ETL community has developed its own set of best practices to meet these and other requirements.
In figure 3, an ETL process creates the flat file to populate the online store database. It extracts data from the catalog system and transforms it to produce the view expected by the online store application. For the purpose of our discussion, this ETL process is a black box: it could be implemented with an ETL tool (like Talend) or even with another Spring Batch job. We focus next on how the online store application reads and writes the catalog's product information.
The online store application sells products out of a catalog, making the product a main domain concept. The import product batch reads the product records from a flat file created by ACME and updates the online store application database accordingly. Figure 4 illustrates that reading and writing products is at the core of this batch job, but it contains other steps as well.
Figure 4 The Spring Batch job consists of the following steps: decompression and read-write.
The read-write step forms the core of the batch job, but as figure 4 shows, this isn't the only step. This batch job consists of the following steps:
This batch process allows us to introduce the Spring Batch features displayed in table 1.
Table 1 Spring Batch features introduced by the import catalog job
|Batch process step
|Spring Batch feature
Rather than describe each of Spring Batch's features in the order in which they appear as batch job steps, we start with the core of the process: reading and writing the products. Then we see how to decompress the incoming file before making the process more robust by validating the input parameters and choosing to skip invalid records to avoid the whole job failing on a single error.
Reading and writing the product catalog is at the core of the Spring Batch job. ACME provides the product catalog as a flat file, which the job needs to import into the online store database. Reading and writing is Spring Batch's sweet spot: for the import product job, you only have to configure one Spring Batch component to read the content of the flat file, implement a simple interface for the writing component, and create a configuration file to handle the batch execution flow. Table 1 lists the Spring Batch features introduced by the import catalog job. Let's start by using Spring Batch to implement the read-write use case.
Because read-write (and copy) scenarios are common in batch applications, Spring Batch provides specific support for this use case. Spring Batch includes many ready-touse components to read from and write to data stores like files and databases.
Figure 5 In read-write scenarios, Spring Batch uses chunk processing. Spring Batch reads items one by one from an ItemReader, collects the items in a chunk of a given size, and sends that chunk to an ItemWriter.
Batch also includes a batch-oriented algorithm to handle the execution flow, called chunk processing. Figure 5 illustrates the principle of chunk processing.
Spring Batch handles read-write scenarios by managing an ItemReader and an ItemWriter. Using chunk processing, Spring Batch collects items one at a time from the item reader into a configurable-sized chunk. Spring Batch then sends the chunk to the item writer and goes back to using the item reader to create another chunk, and so on, until the input is exhausted.
CHUNK PROCESSING Chunk processing is particularly well suited to handle large data operations because a job handles items in small chunks instead of processing them all at once. Practically speaking, a large file won't be loaded in memory; instead it's streamed, which is more efficient in terms of memory consumption. Chunk processing allows more flexibility to manage the data flow in a job. Spring Batch also handles transactions and errors around read and write operations.
Spring Batch provides an optional processing step in chunk processing: a job can process (transform) read items before sending them to the ItemWriter. The ability to process an item is useful when you don't want to write an item as is. The component that handles this transformation is an implementation of the ItemProcessor interface. Because item processing in Spring Batch is optional, the illustration of chunk processing shown in figure 5 is still valid. Figure 6 illustrates chunk processing combined with item processing.
Figure 6 Chunk processing combined with item processing: an item processor can transform input items before calling the item writer.
What can you do in an ItemProcessor? You can perform any transformations you need on an item before Spring Batch sends it to the ItemWriter. This is where you implement the logic to transform the data from the input format into the format expected by the target system. Spring Batch also lets you validate and filter input items. If you return null from the ItemProcessor method process, processing for that item stops and Spring Batch won't insert the item in the database.
NOTE Our read-write use case doesn't have an item-processing step.
The following listing shows the definition of the chunk-processing interfaces ItemReader, ItemProcessor, and ItemWriter.
Listing 1 Spring Batch interfaces for chunk processing
package org.springframework.batch.item;public interface ItemReader
{ T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException; } package org.springframework.batch.item;public interface ItemProcessor { O process(I item) throws Exception; } package org.springframework.batch.item;import java.util.List; public interface ItemWriter { void write(List extends T> items) throws Exception; }
The next two subsections show how to configure the Spring Batch flat file ItemReader and how to write your own ItemWriter to handle writing products to the database.
Spring Batch provides the FlatFileItemReader class to read records from a flat file. To use a FlatFileItemReader, you need to configure some Spring beans and implement a component that creates domain objects from what the FlatFileItemReader reads; Spring Batch will handle the rest. You can kiss all your old boilerplate I/O code goodbye and focus on your data.
The input flat file format consists of a header line and one line per product record. Here's an excerpt:
PRODUCT_ID,NAME,DESCRIPTION,PRICE PR....210,BlackBerry 8100 Pearl,A cell phone,124.60 PR....211,Sony Ericsson W810i,Yet another cell phone!,139.45 PR....212,Samsung MM-A900M Ace,A cell phone,97.80 PR....213,Toshiba M285-E 14,A cell phone,166.20 PR....214,Nokia 2610 Phone,A cell phone,145.50
You may recognize this as the classic comma-separated value (CSV) format. There's nothing out of the ordinary in this flat file: for a given row, the format separates each column value from the next with a comma. Spring Batch maps each row in the flat file to a Product domain object.
The Product class maps the different columns of the flat file. Note the instance variable declarations for product attributes like id, name, price, and so on, in this snippet; the getter and setter methods are excluded for brevity:
package com.manning.sbia.ch01.domain; import java.math.BigDecimal; public class Product { private String id; private String name; private String description; private BigDecimal price; (...) }
NOTE We use a BigDecimal for the product price because the Java float and double primitive types aren't well suited for monetary calculations. For example, it's impossible to exactly represent 0.1.
Let's now use the FlatFileItemReader to create Product objects out of the flat file.
The FlatFileItemReader class handles all the I/O for you: opening the file, streaming it by reading each line, and closing it. The FlatFileItemReader class delegates the mapping between an input line and a domain object to an implementation of the LineMapper interface. Spring Batch provides a handy LineMapper implementation called DefaultLineMapper, which delegates the mapping to other strategy interfaces. Figure 7 shows all of this delegation work.
Figure 7 The FlatFileItemReader reads the flat file and delegates the mapping between a line and a domain object to a LineMapper. The LineMapper implementation delegates the splitting of lines and the mapping between split lines and domain objects.
That's a lot of delegation, and it means you'll have more to configure, but such is the price of reusability and flexibility. You'll be able to configure and use built-in Spring Batch components or provide your own implementations for more specific tasks.
The DefaultLineMapper is a typical example; it needs
You'll soon see the whole Spring configuration in listing 2 (LineTokenizer is of particular interest), but next we focus on the FieldSetMapper implementation to create Product domain objects.
public interface FieldSetMapper
{ T mapFieldSet(FieldSet fieldSet) throws BindException; }
The FieldSet parameter comes from the LineTokenizer. Think of it as an equivalent to the JDBC ResultSet: it retrieves field values and performs conversions between String objects and richer objects like BigDecimal. The following snippet shows the ProductFieldSetMapper implementation:
package com.manning.sbia.ch01.batch; import org.springframework.batch.item.file.mapping.FieldSetMapper; import org.springframework.batch.item.file.transform.FieldSet; import org.springframework.validation.BindException; import com.manning.sbia.ch01.domain.Product; public class ProductFieldSetMapper implements FieldSetMapper
{ public Product mapFieldSet(FieldSet fieldSet) throws BindException { Product product = new Product(); product.setId(fieldSet.readString("PRODUCT_ID")); product.setName(fieldSet.readString("NAME")); product.setDescription(fieldSet.readString("DESCRIPTION")); product.setPrice(fieldSet.readBigDecimal("PRICE")); return product; } }
The ProductFieldSetMapper implementation isn't rocket science, and that's exactly the point: it focuses on retrieving the data from the flat file and converts values into Product domain objects. We leave Spring Batch to deal with all of the I/O plumbing and efficiently reading the flat file. Notice in the mapFieldSet method the String literals PRODUCT_ID, NAME, DESCRIPTION, and PRICE. Where do these references come from? They're part of the LineTokenizer configuration, so let's study the Spring configuration for FlatFileItemReader.
The FlatFileItemReader can be configured like any Spring bean using an XML configuration file, as shown in the following listing.
Listing 2 Spring configuration of the FlatFileItemReader
<bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader"> <property name="resource" value="file:./work/output/output.txt" /> <property name="linesToSkip" value="1" /><property name="lineMapper"> <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> <property name="lineTokenizer"> <bean class="org.springframework.batch.item.file.transform.[CA] DelimitedLineTokenizer"> &l;property name="names" value="PRODUCT_ID, [CA] NAME,DESCRIPTION,PRICE" /> </bean> </property> <property name="fieldSetMapper"> <bean class="com.manning.sbia.ch01.batch. [CA] ProductFieldSetMapper" /> </property> </bean> </property> </bean>
In this example, the resource property defines the input file. Because the first line of the input file contains headers, you ask Spring Batch to skip this line by setting the property linesToSkip (#1) to 1. You use a DelimitedLineTokenizer (#2) to split each input line into fields; Spring Batch uses a comma as the default separator. Then you define the name of each field. These are the names used in the ProductFieldSetMapper class to retrieve values from the FieldSet. Finally, you inject an instance of ProductFieldSetMapper into the DefaultLineMapper.
That's it; your flat file reader is ready! Don't feel overwhelmed because flat file support in Spring Batch uses many components—that's what makes it powerful and flexible. Next up, to implement the database item writer, you need to do less configuration work but more Java coding. Let's dig in.
package com.manning.sbia.ch01.batch; import java.util.List; import javax.sql.DataSource; import org.springframework.batch.item.ItemWriter; import org.springframework.jdbc.core.JdbcTemplate; import com.manning.sbia.ch01.domain.Product; public class ProductJdbcItemWriter implements ItemWriter
{ private static final String INSERT_PRODUCT = "insert into product "+ "(id,name,description,price) values(?,?,?,?)"; private static final String UPDATE_PRODUCT = "update product set "+ "name=?, description=?, price=? where id=?"; private JdbcTemplate jdbcTemplate;public ProductJdbcItemWriter(DataSource ds) { this.jdbcTemplate = new JdbcTemplate(ds); } public void write(List extends Product> items) throws Exception { for (Product item : items) { int updated = jdbcTemplate.update(UPDATE_PRODUCT, item.getName(),item.getDescription(), item.getPrice(),item.getId() ); if (updated == 0) { jdbcTemplate.update(INSERT_PRODUCT, item.getId(),item.getName(), item.getDescription(),item.getPrice() ); } } } }
The ProductJdbcItemWriter uses Spring's JdbcTemplate to interact with the database. Spring Batch creates the JdbcTemplate with a DataSource injected in the constructor (#1). In the write method, you iterate over a chunk of products and first try to update an existing record (#2). If the database tells you the update statement didn't update any record, you know this record doesn't exist, and you can insert it (#3).
That's it for the implementation! Notice how simple it was to implement this ItemWriter because Spring Batch handles getting records from the ItemReader, creating chunks, managing transactions, and so on. Next, let's configure the database item writer.
For the item writer to be configured as a Spring bean, it needs a DataSource, as shown in the following XML fragment:
<bean id="writer" class="com.manning.sbia.ch01.batch.ProductJdbcItemWriter"> <constructor-arg ref="dataSource" /> </bean>
You'll configure the DataSource later, in a separate configuration file. You use a separate file because it decouples the application configuration—the item writer—from the infrastructure configuration—the DataSource. By doing so, you can use the same application configuration across different environments—production and testing, for example—and switch the infrastructure configuration file.
Now that you've created the two parts of the read-write step, you can assemble them in a Spring Batch job.
Configuring the read-write step is done through Spring. The step configuration can sit next to the declaration of the reader and writer beans, as shown in the following listing.
Listing 4 Spring configuration of the read-write step
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:batch="http://www.springframework.org/schema/batch" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd"> <job id="importProducts"xmlns="http://www.springframework.org/schema/batch"> <step id="readWriteProducts"> <tasklet> <chunk reader="reader" writer="writer"commit-interval="100" /></tasklet> </step> </job> <bean id="reader" (...) </bean> <bean id="writer" (...) </bean> </beans>
The configuration file starts with the usual declaration of the namespaces and associated prefixes: the Spring namespace and Spring Batch namespace with the batch prefix. The Spring namespace is declared as the default namespace, so you don't need to use a prefix to use its elements. Unfortunately, this is inconvenient for the overall configuration because you must use the batch prefix for the batch job elements. To make the configuration more readable, you can use a workaround in XML: when you start the job configuration XML element (#1), you specify a default XML namespace as an attribute of the job element. The scope of this new default namespace is the job element and its child elements.
The chunk element (#2) configures the chunk-processing step, in a step element, which is itself in a tasklet element. In the chunk element, you refer to the reader and writer beans with the reader and writer attributes. The values of these two attributes are the IDs previously defined in the reader and writer configuration. Finally, at #3 the commit-interval attribute is set to a chunk size of 100.
Choosing a chunk size and commit interval First, the size of a chunk and the commit interval are the same thing! Second, there's no definitive value to choose. Our recommendation is a value between 10 and 200. Too small a chunk size creates too many transactions, which is costly and makes the job run slowly. Too large a chunk size makes transactional resources—like databases—run slowly too, because a database must be able to roll back operations. The best value for the commit interval depends on many factors: data, processing, nature of the resources, and so on. The commit interval is a parameter in Spring Batch, so don't hesitate to change it to find the most appropriate value for your jobs.
You're done with the copy portion of the batch process. Spring Batch performs a lot of the work for you: it reads the products from the flat file and imports them into the database. You didn't write any code for reading the data. For the write operation, you only created the logic to insert and update products in the database. Putting these components together is straightforward thanks to Spring's lightweight container and the Spring Batch XML vocabulary.
So far, you've implemented the box labeled "Reading and writing" from figure 4. As you've seen, Spring Batch provides a lot of help for this common use case. The framework is even richer and more flexible because a batch process can contain any type of write operation. You'll see an example of this next, when you decompress the input file for your job, as shown in figure 4 in the box labeled "Decompressing."
Remember that the flat file is uploaded to the online store as a compressed archive. You need to decompress this file before starting to read and write products. Decompressing a file isn't a read-write step, but Spring Batch is flexible enough to implement such a task as part of a job. Before showing you how to decompress the input file, let's explain why you must compress the products flat file.
The flat file containing the product data is compressed so you can upload it faster from ACME's network to the provider that hosts the online store application. Textual data, as used in the flat file, can be highly compressed, with ratios of 10 to 1 commonly achieved. A 1-GB flat file can compress to 100 MB, which is a more reasonable size for file transfers over the internet.
Note that you could encrypt the file as well, ensuring that no one could read the product data if the file were intercepted during transfer. The encryption could be done before the compression or as part of it. In this case, assume that ACME and the hosting provider agreed on a secure transfer protocol, like Secure Copy (SCP is built on top of Secure Shell [SSH]).
Now that you know why you compress the file, let's see how to implement the decompression tasklet.
Spring Batch provides an extension point to handle processing in a batch process step: the Tasklet. You implement a Tasklet that decompresses a ZIP archive into its source flat file. The following listing shows the implementation of the Decompress-Tasklet class.
Listing 5 Implementation of decompression tasklet
package com.manning.sbia.ch01.batch; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.zip.ZipInputStream; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.core.io.Resource; public class DecompressTasklet implements Tasklet {private Resource inputResource;private String targetDirectory; private String targetFile; public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { ZipInputStream zis = new ZipInputStream(new BufferedInputStream( inputResource.getInputStream())); File targetDirectoryAsFile = new File(targetDirectory); if(!targetDirectoryAsFile.exists()) { FileUtils.forceMkdir(targetDirectoryAsFile); } File target = new File(targetDirectory,targetFile); BufferedOutputStream dest = null; while(zis.getNextEntry() != null) {if(!target.exists()) { target.createNewFile(); } FileOutputStream fos = new FileOutputStream( target ); dest = new BufferedOutputStream(fos); IOUtils.copy(zis,dest); dest.flush(); dest.close(); } zis.close(); if(!target.exists()) { throw new IllegalStateException( "Could not decompress anything from the archive!"); } return RepeatStatus.FINISHED;} /* setters */ (...)
The DecompressTasklet class implements the Tasklet interface (#1), which has only one method, called execute. The tasklet has three fields (#2), which represent the archive file, the name of the directory to which the file is decompressed, and the name of the output file. These fields are set when you configure the tasklet with Spring. In the execute method, you open a stream to the archive file (#3), create the target directory if it doesn't exist (#4), and use the Java API to decompress the ZIP archive (#5). Note that the FileUtils and IOUtils classes from the Apache Commons IO project are used to create the target directory and copy the ZIP entry content to the target file (Apache Commons IO provides handy utilities to deal with files and directories). At #6, you return the FINISHED constant from the RepeatStatus enumeration to notify Spring Batch that the tasklet finished.
Only a data file and no metadata file in the ZIP archive? It's common practice to have two files in a ZIP archive used for a batch job. One file contains the data to import, and the other contains information about the data to import (date, identifier, and so on). We wanted to keep things simple in our Spring Batch introduction, especially the tedious unzipping code, so our ZIP archive contains only a data file. Let's say the name of the unzipped file is made up of meaningful information such as the date and an identifier for the import.
Although the Tasklet interface is straightforward, its implementation includes a lot of code to deal with decompressing the file. Let's now see how to configure this tasklet with Spring.
The tasklet is configured as part of the job and consists of two changes in Spring: declare the tasklet as a Spring bean and inject it as a step in the job. To do this, you must modify the configuration you wrote for reading and writing products, as shown in the following listing.
Listing 6 Spring configuration of the decompress tasklet
<job id="importProducts" xmlns="http://www.springframework.org/schema/batch"> <step id="decompress" next="readWriteProducts"><tasklet ref="decompressTasklet" /> </step> <step id="readWriteProducts"> <tasklet> <chunk reader="reader" writer="writer" commit-interval="100" /> </tasklet> </step> </job> <bean id="decompressTasklet"class="com.manning.sbia.ch01.batch. [CA] DecompressTasklet"> <property name="inputResource" value="file:./input/input.zip" /> <property name="targetDirectory" value="./work/output/" /> <property name="targetFile" value="products.txt" /> </bean>
The configuration of a plain Tasklet is simpler than for a read-write step because you only need to point the Tasklet to the (decompression) bean (#1). Note that you control the job flow through the next attribute of the step element, which refers to the readWriteProducts step by ID. The tasklet element (#1) refers to the decompressTasklet bean, declared at #2. If you find that the Tasklet bean is configured too rigidly in the Spring file (because the values are hardcoded), don't worry: we'll show you later in this article how to make these settings more dynamic.
You now have all the parts of the job implemented and configured: you can decompress the input archive, read the products from the decompressed flat file, and write them to the database. You're now about to see how to launch the job inside an integration test.
Batch applications are like any other applications: you should test them using a framework like JUnit. Testing makes maintenance easier and detects regressions after refactoring. Let's test, then! This section covers how to write an integration test for a Spring Batch job. You'll also learn about the launching API in Spring Batch. But don't be too impatient—we need a couple of intermediary steps before writing the test: configuring a test infrastructure and showing you a trick to make the job configuration more flexible.Spring Batch and test-driven development Good news: Spring Batch and test-driven development are fully compatible! We introduce here some techniques to test a Spring Batch job. We truly believe in test-driven development, so we test all the source code with automated tests. The next section is about setting up the test infrastructure: the ACME job needs a database to write to, and Spring Batch itself needs a couple of infrastructure components to launch jobs and maintain execution metadata. Let's see how to configure a lightweight test infrastructure to launch the test from an IDE.
Setting up the test infrastructure Spring Batch needs infrastructure components configured in a Spring lightweight container. These infrastructure components act as a lightweight runtime environment to run the batch process. Setting up the batch infrastructure is a mandatory step for a batch application, which you need to do only once for all jobs living in the same Spring application context. The jobs will use the same infrastructure components to run and to store their state. These infrastructure components are the key to managing and monitoring jobs.
Spring Batch needs two infrastructure components:
For this test, you use the volatile job repository implementation. It's perfect for testing and prototyping because it stores execution metadata in memory. The following listing shows how to configure the test infrastructure.
Listing 7 Spring configuration for the batch infrastructure
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <jdbc:embedded-database id="dataSource" type="H2"><jdbc:script location="/create-tables.sql"/> </jdbc:embedded-database> <bean id="transactionManager"class="org.springframework.jdbc.datasource. [CA] DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="jobRepository"class="org.springframework.batch.core. [CA] repository.support.MapJobRepositoryFactoryBean"> <property name="transactionManager" ref="transactionManager" /> </bean> <bean id="jobLauncher"class="org.springframework.batch.core.launch. [CA] support.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository" /> </bean> <bean class="org.springframework.jdbc.core.JdbcTemplate"> <constructor-arg ref="dataSource" /> </bean> </beans>
This listing uses an open source in-memory database called H2; although it may look odd for an online application, it's easy to deploy and you won't have to install any database engine to work with the code samples in this article. And remember, this is the testing configuration; the application can use a full-blown, persistent database in production. For a more traditional relational database management system (RDBMS) setup, you could change the data source configuration to use a database like PostgreSQL or Oracle. Listing 7 also runs a SQL script on the database to create the product table and configures a JdbcTemplate to check the state of the database during the test.
How does a job refer to the job repository? You may have noticed that we say a job needs the job repository to run but we don't make any reference to the job repository bean in the job configuration. The XML step element can have its job-repository attribute refer to a job repository bean. This attribute isn't mandatory, because by default the job uses a jobRepository bean. As long as you declare a jobRepository bean of type JobRepository, you don't need to explicitly refer to it in your job configuration.
This leads us to the following best practice: when configuring a Spring Batch application, the infrastructure and job configuration should be in separate files.
SPLITTING INFRASTRUCTURE AND APPLICATION CONFIGURATION FILES You should always split infrastructure and application configuration files (test-context.xml and import-products-job-context.xml in our example). This allows you to swap out the infrastructure for different environments (test, development, staging, production) and still reuse the application (job, in our case) configuration files.
In a split application configuration, the infrastructure configuration file defines the job repository and data source beans; the job configuration file defines the job and depends on the job repository and data source beans. For Spring to resolve the whole configuration properly, you must bootstrap the application context from both files.
You completed the infrastructure and job configuration in a flexible manner by splitting the configuration into an infrastructure file and a job file. Next, you make the configuration more flexible by leveraging the Spring Expression Language (SpEL) to avoid hardcoding certain settings in Spring configuration files.
Remember that part of your job configuration is hardcoded in the Spring configuration files, such as all file location settings (in bold):
<bean id="decompressTasklet" class="com.manning.sbia.ch01.batch.DecompressTasklet"> <property name="inputResource" value="file:./input/input.zip" /> <property name="targetDirectory" value="./work/output/" /> <property name="targetFile" value="products.txt" /> </bean>
These settings aren't flexible because they can change between environments (testing and production, for example) and because rolling files might be used for the incoming archive (meaning the filename would depend on the date). An improvement is to turn these settings into parameters specified at launch time. When launching a Spring Batch job, you can provide parameters, as in the following:
jobLauncher.run(job, new JobParametersBuilder() .addString("parameter1", "value1") .addString("parameter2", "value2") .toJobParameters());
The good news is that you can refer to these parameters in your job configuration, which comes in handy for the DecompressTasklet and FlatFileItemReader beans, as shown in the following listing.
Listing 8 Referring to job parameters in the Spring configuration
<bean id="decompressTasklet" class="com.manning.sbia.ch01.batch.DecompressTasklet" scope="step"><property name="inputResource"value="#{jobParameters['inputResource']}" /> <property name="targetDirectory" value="#{jobParameters['targetDirectory']}" /> <property name="targetFile" value="#{jobParameters['targetFile']}" /> </bean> <bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"><property name="resource" value="file:#{jobParameters['targetDirectory'] [CA] +jobParameters['targetFile']}" />
To be able to refer to job parameters, a bean must use the Spring Batch step scope (#1). The step scope means that Spring will create the bean only when the step asks for it and that values will be resolved then (this is the lazy instantiation pattern; the bean isn't created during the Spring application context's bootstrapping). To trigger the dynamic evaluation of a value, you must use the #{expression} syntax. The expression must be in SpEL, which is available as of Spring 3.0 (Spring Batch falls back to a less powerful language if you don't have Spring 3.0 on your class path). The jobParameters variable behaves like a Map. That's how you refer to the inputResource, targetDirectory, and targetFile job parameters (#2). Note that you're not limited to plain references; you can also use more complex expressions; for example, notice how the target directory and file are concatenated for the resource property.
You're done with the configuration: the job and infrastructure are ready, and part of the configuration can come from job parameters, which are set when you launch the job. It's time to write the test for your batch process.
You use good old JUnit to write the test, with some help from the Spring testing support. The following listing shows the integration test for the job.
Listing 9 Integration test for the import product test
package com.manning.sbia.ch01.batch; (...) @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={ "/import-products-job-context.xml", "/test-context.xml" }) public class ImportProductsIntegrationTest { @Autowired private JobLauncher jobLauncher; @Autowired private Job job; @Autowired private JdbcTemplate jdbcTemplate; @Before public void setUp() throws Exception { jdbcTemplate.update("delete from product");jdbcTemplate.update("insert into product "+ "(id,name,description,price) values(?,?,?,?)", "PR....214","Nokia 2610 Phone","",102.23 ); } @Test public void importProducts() throws Exception { int initial = jdbcTemplate.queryForInt("select count(1) from product"); jobLauncher.run(job, new JobParametersBuilder() .addString("inputResource", "classpath:/input/products.zip") .addString("targetDirectory", "./target/importproductsbatch/") .addString("targetFile", "products.txt") .addLong("timestamp", System.currentTimeMillis()) .toJobParameters() ); int nbOfNewProducts = 7; Assert.assertEquals(initial+nbOfNewProducts, jdbcTemplate.queryForInt( "select count(1) from product") ); } }
The test uses the Spring TestContext Framework, which creates a Spring application context during the test and lets you inject some Spring beans into the test (with the @Autowired annotation). The @RunWith and @ContextConfiguration trigger the Spring TestContext Framework. At #1, you clean and populate the database. This creates a consistent database environment for each @Test method. At #2, you launch the job with its parameters and check at #3 that the job correctly inserted the products from the test ZIP archive. The test ZIP archive doesn't have to contain thousands of records: it can be small so the test runs quickly.
You can now run the test with your favorite IDE (Eclipse, IDEA) or build tool (Maven, Ant). Figure 8 shows the result of the test execution in Eclipse.
Figure 8 Launching the test in Eclipse. Despite all its features, Spring Batch remains lightweight, making jobs easy to test.
That's it! You have a reliable integration test for your batch job. Wasn't it easy? Even if the job handles hundreds of thousands of records daily, you can test in an IDE in a couple of seconds.
NOTE A common requirement is launching jobs from the command line.
The job works, great, but batch applications aren't common pieces of software: they must be bulletproof. What happens if the input file contains a badly formatted line? Could you live with your job crashing because of an extra comma? The next section covers how Spring Batch lets you skip incorrect lines instead of failing.
We listed the requirements for batch applications, including robustness. The import product job isn't robust yet: for example, it crashes abruptly if only a single line of the flat file is formatted incorrectly. The good news is that Spring Batch can help make the job more robust by changing the configuration or by implementing simple interfaces.
We will show you how to handle unexpected entries when you're reading data. By the end of this section, the import product job will be more robust and you'll have a better understanding of how Spring Batch can help improve robustness in general.
On a good day, the import product job will decompress the input archive, read each line of the extracted flat file, send data to the database, and then exit successfully. As you know, if something can go wrong, it will. For instance, if the FlatFileItemReader fails to read a single line of the flat file—because it's incorrectly formatted, for example—the job immediately stops. Perhaps this is acceptable behavior, but what if you can live with some invalid records? In this case, you could skip an invalid line and keep on chugging. Spring Batch allows you to choose declaratively a skip policy when something goes wrong. Let's apply a skip policy to your job's import step.
Suppose a line of the flat file hasn't been generated correctly, like the price (in bold) of the third product in the following snippet:
PRODUCT_ID,NAME,DESCRIPTION,PRICE PR....210,BlackBerry 8100 Pearl,,124.60 PR....211,Sony Ericsson W810i,,139.45 PR....212,Samsung MM-A900M Ace,,97,80 PR....213,Toshiba M285-E 14,,166.20
The format of the price field of the third record is incorrect: is uses a comma instead of a period as the decimal separator. Note that the comma is the field separator Spring Batch uses to tokenize input lines: the framework would see five fields where it expects only four. The FlatFileItemReader throws a FlatFileParseException and, in the default configuration, Spring Batch immediately stops the process.
Assuming you can live with skipping some records instead of failing the whole job, you can change the job configuration to keep on reading when the reader throws a FlatFileParseException, as shown in the following listing.
Listing 10 Setting the skip policy when reading records from the flat file
<job id="importProducts" xmlns="http://www.springframework.org/schema/batch"> <step id="decompress" next="readWriteProducts"> <tasklet ref="decompressTasklet" /> </step> <step id="readWriteProducts"> <tasklet> <chunk reader="reader" writer="writer" commit-interval="100" skip-limit="5"><skippable-exception-classes><include class="org.springframework.batch. [CA] item.file.FlatFileParseException" /> </skippable-exception-classes> </chunk> </tasklet> </step> </job>
The skip policy is set in the chunk element. The skip-limit attribute (#1) is set to tell Spring Batch to stop the job when the number of skipped records in the step exceeds this limit. Your application can be tolerant, but not too tolerant! Then, the exception classes that trigger a skip are stated (#2). Here, we want to skip the offending line when the item reader throws a FlatFileParseException.
You can now launch the job with an input file containing incorrectly formatted lines, and you'll see that Spring Batch keeps on running the job as long as the number of skipped items doesn't exceed the skip limit. Assuming the ZIP archive contains incorrect lines, you can add a test method to your test, as shown in the following listing.
Listing 11 Testing the job correctly skips incorrect lines with a new test method
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"/import-products-job-context.xml","/testcontext.xml"}) public class ImportProductsIntegrationTest { (...) @Test public void importProductsWithErrors() throws Exception { int initial = jdbcTemplate.queryForInt("select count(1) from product"); jobLauncher.run(job, new JobParametersBuilder() .addString("inputResource", "classpath:/input/products_with_errors.zip") .addString("targetDirectory", "./target/importproductsbatch/") .addString("targetFile","products.txt") .addLong("timestamp", System.currentTimeMillis()) .toJobParameters() ); int nbOfNewProducts = 6; Assert.assertEquals( initial+nbOfNewProducts, jdbcTemplate.queryForInt("select count(1) from product") ); } }
Note that this code doesn't do any processing when something goes wrong, but you could choose to log that a line was incorrectly formatted. Spring Batch also provides hooks to handle errors.
This completes the bullet-proofing of the product import job. The job executes quickly and efficiently, and it's more robust and reacts accordingly to unexpected events such as invalid input records.
That's it—you've implemented a full-blown job with Spring Batch! This shows how Spring Batch provides a powerful framework to create batch jobs and handles the heavy lifting like file I/O. Your main tasks were to write a couple of Java classes and do some XML configuration. That's the philosophy: focus on the business logic and Spring Batch handles the rest.
Here are some other Manning titles you might be interested in:
Spring in Action, Third EditionCraig Walls
Spring in PracticeWillie Wheeler, John Wheeler, and Joshua White
Spring Integration in ActionMark Fisher, Jonas Partner, Marius Bogoevici, and Iwein Fuld


text:
The new better off calculator provides information on whether there is financial benefit of moving into work and promotes take-up of Working Tax Credit.
The calculator complements the objectives of entitledto's existing calculators which are to:
a) maximise incomes through increasing benefit take-up
b) provide information on the impact of welfare reform on residents.
For those who can work, the new rules ensure that most will be better off if they do work. Not only does this increase the resident's income, it also leads to protection from benefit changes such as the benefits cap if they meet the qualifying criteria for Working Tax Credit. For local authorities, their finances are directly impacted by the amount of Council Tax Support that is paid out.
It is important that any residents who can increase their income through Working Tax Credit do so, as this will lead directly to a reduction in council expenditure through the Local Council Tax Support scheme. For both of these purposes it is important that residents and local authorities can identify who will be better off in work and how much better off they will be. It is also important to identify in-work entitlements that are not being claimed, in particular Working Tax Credit.
How does the new better off calculator work?
Available now
The better off calculator has been developed to complement existing benefit calculators. It enables the user to present a hypothetical circumstance of employment and see clearly the impact on their income – both their total net income and the impact on the individual's benefits and tax credits. It clearly shows whether there are financial benefits of moving into work. Contact us now to find out how this new functionality can work for you.
Get in touch
To find out about how entitledto's online solutions can work for you Contact Us now.
The Government is introducing significant changes to the Benefits System
It has never been more important to understand what you can claim
To sign up for entitledto updates, please leave us your name and email address
We understand that your privacy is really important, and that the anonymous, independent nature of entitledto.co.uk's service is vital.
So we promise:
1. To respect your privacy. Your email address will NOT be associated with the information you input into the benefits calculator. The answers you provide will not be retained in our system.
As different parts of the benefits system change, we may want to notify you of specific changes which might affect you personally. For example, if you are entitled to Universal Credit, we might send you updates on that topic. However, we will NOT keep information that associates specific users with particular figures or other information of that sort.
At present we do not do this. If that changes, we'll let you know.
2. Never to resell your information or use it for marketing purposes. We will ONLY use it to keep you up to date about changes, or proposed changes to the benefits system.
3. You'll always be able to unsubscribe, if you'd like to, for any reason.

subset: commoncrawl


text:
Free Download MOD APK Android Bubble CoCo | Only best games at Sbenny.com
Game Description:
Shoot through bubbles in hundreds of levels to save the chicks, squish spiders, and beat the fox! But watch out, as Mr. Fox has set up numerous traps like the slime bubble to keep you from reaching your goal!
Mr. Fox is no match for you with the various items and boosters available in Bubble CoCo! Send him flying with items such as the Rocket, or give him a good shock with boosters such as the Lightning Bubble!
Pop your way to save CoCo's chicks in this bubble shooting adventure!
Game Requirements and Details:
Android Version Required: 4.0.3 and higher versions of Android Smartphones and Tablets
Required Storage Space: 48 MB or more
Internet connection NOT required to play
APK ID: com.cookapps.bubblecoco
Last Game Version: 126.96.36.199
Genre: Puzzle
Price: Free with In-App Purchases
Ads? NO
Installation Instructions:
- Download one of the [APK] files below (the MOD version is the HACKED game) OR try the [Google Play] version;
- Move the .apk game file into your Android Smartphone or Tablet and install it (if you are on mobile, just install the apk tapping on it);
- Launch the app and have fun with Bubble CoCo !
Free Download Bubble CoCo APK Android
Broken Link? Outdated Version? Report it! Want us to make a custom MOD for you? Visit our dedicated Forum!
[APK] [48.3 MB] [v184.108.40.206] [MEGA MOD]
MEGA MOD Features:
- 200 Moves.
- Unlimited Lives
- Infinite Boosters
- Unlimited Coins
- Infinite Gems
[APK] [44.1 MB] [v126.96.36.199] [MEGA MOD]
MEGA MOD Features:
- 100 Extra Moves
- Unlimited Lives
- Infinite Boosters
- Unlimited Coins
- All Episodes Unlocked
- Score Multiplied
[APK] [39.9 MB] [v18.104.22.168] [MEGA MOD]
MEGA MOD Features:
- 100 Moves.
- Unlimited Lives.
- Unlimited Boosters.
- Unlimited Coins.
- Unlimited Diamonds.
- Score Multiplier.
[APK+DATA] [Google Play] [Free Game]
Have troubles installing Bubble CoCo? Please read our Forum guide about HOW TO INSTALL ANDROID GAMES AND APPS.
Link broken? Looking for a newer or MOD (hacked) version of Bubble CoCo? Join our community and we will help you!


text:
Decision makers
- The College of New Jersey
The College of New Jersey: Expand and upgrade the Physical Enhancement Center in Packer Hall!
TCNJ's Physical Enhancement Center is far too small to house the thousands of students it is open to. While there is an athlete gym with high quality equipment, it is generally not open to all students. Packer's PEC should be expanded to appropriately represent the number of students who go to the school. Not only that, but there should be access to more free-weights and higher quality workout machines. Many of the pieces of equipment are outdated and break relatively frequently. TCNJ would be benefiting their entire student body if they truly expanded the PEC into a much larger, accessible, and higher quality gym. Sign this petition of you agree that TCNJ should invest more in the health of their students.
- The College of New Jersey
Please expand and upgrade the Physical Enhancement Center in Packer Hall. In its current state, students must constantly compete for free weights that constantly go missing, wait in lines to access certain machines, and deal with workout machines that break frequently. The entire student body would appreciate an investment in a better, higher quality gym capable of holding more students who want to become healthier and get in shape.
Jeff Kranz started this petition with a single signature, and now has 18 supporters. Start a petition today to change something you care about.
Report abuse
Please report any content that may violate Change.org's Terms of Service or Community Guidelines.
Thank you for taking the time to report content. Our team will review your claim and contact you if we need more information.


text: Got a disaster recovery plan? It might be just what your company's missing. When disaster strikes, it isn't just data that can go down the tubes, it's revenue and, eventually, your entire business. This infographic takes a look at some of the key disasters that can lead to data loss, what effects those losses can have for businesses and what businesses can do to protect their data - and their livelihood.


text:
Directors:Dean DeBlois, Chris Sanders Writers:William Davies (screenplay), Dean DeBlois Stars:Jay Baruchel, Gerard Butler, Christopher Mintz-Plasse Ratings: 8,2/10 from 298.999 users Rated PGGenres:Animation | Adventure | Comedy | Drama | Family | FantasyCountry:USA Language:English Release Date:19 March 2010 Link:IMDb Storyline: Long ago up North on the Island of Berk, the young Viking, Hiccup, wants to join his town's fight against the dragons that continually raid their town. However, his macho father and village leader, Stoik the Vast, will not allow his small, clumsy, but inventive son to do so. Regardless, Hiccup ventures out into battle and downs a mysterious Night Fury dragon with his invention, but can't bring himself to kill it. Instead, Hiccup and the dragon, whom he dubs Toothless, begin a friendship that would open up both their worlds as the observant boy learns that his people have misjudged the species. But even as the two each take flight in their own way, they find that they must fight the destructive ignorance plaguing their world.
Click Here To Watch Full Movie
Related Posts
Related terms: Dragons Riders of Berk, How to Train Your Dragon Full Movie, Kung Fu Panda 2008, How to Train Your Dragon Cast, How to Train Your Dragon 2 2014, How to Train Your Dragon 2, How to Train Dragon Movie, How to Train Your Dragon Series


text:
- Name: Shadow Imitation Kunai Technique (影真似痛くないクナイの術, Kagemane Kunai no Jutsu) English TV "Shadow Kunai Possession Jutsu"
- Type: No Rank, Supplementary, mid range (0-10m)
- Users: Shikatora Nara
- Hand seal: Rat, Owl
The Shadow Imitation Shuriken Technique is a jutsu only used by the Nara Clan. Using the Shadow Imitation Jutsu, and then preform the hand seals, the user throws a bunch of shurikens into the shadow. Then, the shuriken will appear anywhere the user wants it to in the shadow, and hit the target. It's a simple jutsu.


text:
From examining the set:
The outside of the box is in German. Alex Randolph's face and name are on the box top. The board is in four parts which fit together without separate clips. Coordinate labels are around all four sides. These labels, as well as the included booklets, follow the more recent convention of A-X left to right, 1-24 top to bottom. Earlier European editions went the other way.
The box includes a plastic insert, a tray for white pieces and a tray for red pieces, a multilingual rules booklet, a booklet of 40 puzzles in German which is still mostly understandable for those who do not speak German, and a tactics & strategy guide in German.
Kosmos later replaced the white pieces with black, although the board still had white and red border rows, and presumably the rules booklet still said white and red.


text:
You might also like
Fishy RushControl the little fish through the dangerous sea and pick up tons of golden coins and powerups in this addictive arcade platformer game.
Flash Fish FreddieHelp Freddie to swim as far as possible and watch out for the dangers of the deep! Use your flash to zap enemy fish and stay safe.
Fox AdventurerCreate paths for Mr. Fox to advance through the mysterious jungle and collect all the magical gems.
OutcomeDive into a dangerous post-apocalyptic world. Embark on a fascinating journey, run through the wasteland and survive in a destroyed world. Be careful and avoid all obstacles, use your skills and collect as many coins as possible to unlock new levels.
Dynamons WorldTravel the World map and defeat and cath Dynamons! Train your monsters and level them up in battles!
Fishy Adventures
You are a little fish in a dangerous sea. Dodge the octopuses, fish and other obstacles. Collect as many coins as possible to buy powerups!


text:
Trent Bridge: India's disastrous world campaign ended to a chorus of boos from its supporters as they suffered 12-run loss to South Africa at Trent Bridge, Nottingham, on Tuesday.
Despite restricting mighty South Africa to 130/5 and then putting up 48-run opening partnership, Indian struggling middle-order, again faltered just when everything was in their favour.The defending champions put up an ordinary batting display and finished with 118 for eight in their 20 overs, falling short of 12 runs.
The Indians, 55-1 at one stage, lost four top order wickets for 14 runs against Proteas bowling attack.
Indian captain Dhoni himself was the best example for India's pathetic batting display as he ran out of wide ball from Morne Morkel when Yuvraj Singh refused his call for a sharp single.
Gautam Gambhir (21) and Rohit Sharma (29) gave India a strong start but it was Yuvraj Singh's run-a-ball 25 that actually rekindled India's hopes. But India's chase effectively ended when Yuvraj was given out caught at the wicket off Steyn in the 19th over.
Johan Botha led a disciplined South African bowling performance, claiming three wickets for 16 runs from four overs, while Dale Steyntook two for 25.
As usual Dhoni blamed India's batting for the defeat against England.
T20 World Cup-Fixture | Results | Points | Top 10 Players(R/W)
"Our batting didn't do well today," he admitted. "I am quite happy with the performance of the bowlers but we lacked a few things with the batting. We have got good support, but we have to win games."
Earlier South Africa, who elected to bat on a slow wicket, struggled against the Indian attack to make just 130-5. De Villiers top scored with 63 off 51 balls, but the Proteas made painful progress with no boundaries scored between the sixth and 13th overs.
Dhoni used eight bowlers to fill up the 20 overs, with five of them picking up wickets as the Proteas attempted to increase the run-rate. Skipper Smith was the only other batsman besides de Villiers to cross 20 as South Africa managed just 32 runs in the last five overs.
The Indians won just two preliminary matches against Bangladesh and Ireland, while losing all three Super Eight games against the West Indies, England and now South Africa.


text: 言の葉-Love Refrain- is a mini album by Enikusu-P, consisting of two songs, and was first released in VO@LOID M@STER 12. A crossfade of the album can be seen in NND, and is purchasable on Toranoana. Released May 8th 2011 Producer Enikusu-P Price ¥525 Illust. Zashiki Usagi-P Label Track list 1. 言の葉-Love Refrain- Kotonoha -Love Refrain-Kagamine Rin 2. 言の葉-Love La fine- Kotonoha -Love La fine-Kagamine Len Retrieved from "http://vocaloid.wikia.com/wiki/Kotonoha_-Love_Refrain-_(%E8%A8%80%E3%81%AE%E8%91%89-Love_Refrain-)_-_Album?oldid=348524" Ad blocker interference detected! Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers Wikia is not accessible if you've made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected. Categories: Albums Albums featuring Kagamine Rin Albums featuring Kagamine Len Add category Cancel Save


text:
Photo: Chefs pause for a group photo before attendees arrive at the Food Network Kitchen for Meat Matters NYC, April 2015. L to R: Bill Telepan (Telepan), Stephen Stryjewski (Cochon, Cochon Butcher, Peche, Board Member), Paul Wetzel (Gramercy Tavern), Howard Kalachnikoff (Gramercy Tavern), Shanna Pacifico, Piper Davis (Grand Central Bakery, Board Member), Rick Bayless (Frontera, Topolobampo, Xoco), Derek Wagner (Nicks on Broadway, Board Member), and Adam Danforth (Butcher, Author, Board Member). Credit: Robert Johnson
What is a Meat Matters event?
Meat Matters events are collaborative, educational fundraisers organized by Member chefs to celebrate – and help create demand for – good, well-raised, and appropriate portions of meat (as well as protein-rich vegetables and grains). The goal of these events is to inspire fellow chefs and the general public to use their individual and collective buying power to 'Change Menus. Change Lives.'
Meat Matters launched in April 2015 at the Food Network in New York City. The Boulder/Denver Chefs Collaborative Locals group hosted a Meat Matters Denver event in May 2015, and we look forward to working with chefs to host more events in 2015!
Proceeds from Meat Matters events benefit Chefs Collaborative scholarship and education programs to help chefs learn about critical issues in our food system, take action, and leverage their buying power to make an impact in their communities.
Chefs Collaborative is a 501(c)3 nonprofit organization and all gifts are tax deductible.
Who can host a Meat Matters event?
Members of Chefs Collaborative can host Meat Matters events! Meat Matters events are organized in cities across the country, throughout the year. By hosting a Meat Matters event, you're helping to do your part to educate and inspire people to buy, cook, and serve good, well-raised and appropriate portions of meat (as well as protein-rich vegetables and grains), and help create a better food system. In addition, anyone can participate in a Meat Matters event by attending one!
How to host a Meat Matters event
Review how organizing a Meat Matters event works – both how Chefs Collaborative supports you and how you support the event.
- Plan your event! Review, access, and utilize the Meat Matters event toolkit. The toolkit includes additional information, instructions, marketing materials, and messaging (password protected – for active event hosts).
Past Meat Matters Events
- April 2015 – Meat Matters New York City
- May 2015 – Meat Matters Denver
- November 2015 – Meat Matters Chicago
- December 2015 – Meat Matters Sarasota
- June 2016 – Meat Matters Fort Myers
- November 2016 – Meat Matters Boulder
Contact us: firstname.lastname@example.com


text:
Rent Business English 10th edition today, or search our site for other textbooks by David C. Howell. Every textbook comes with a 21-day "Any Reason" guarantee. Published by CENGAGE Learning.
Business English 10th edition solutions are available for this textbook.
Need more help with Business English ASAP? We have you covered with 24/7 instant online tutoring. Connect with one of our tutors now.


text:
Video tentang video pele:
pele criticizes brazil manager mano manezes would welcome . Pele has criticized Brazil national team coach Mano Menezes and asked for a change in the direction of the "verde amarela. Steve Sabol's Many NFL Films Innovations Changed Sports Television Broadcasting Video . video amazing video of baby dolphin birth at hawaii resort big . Video by Dolphin Quest Hawaii via YouTube WAIKOLOA, Hawaii: There is a new member of the family at Dolphin Quest Hawaii located at the Hilton Waikoloa Village. The new baby dolphin – the first second generation calf . pelé goal against sweden 1958 youtube. Uploaded by kenigor on Jun 4, 2006 Amazing goal, and Pelé had 17 years old only! Category: Sports License: Standard YouTube License. 82 likes, 5 dislikes.. video 'pele' reacts to anderson silva's book calls 'the spider . Anderson Silva is getting attacked by someone who hates his guts. And for once, it's not Chael Sonnen.. vidéo pêlemêle déco par stéphanie leclerc de tendancedecotv . www.ideesdecadres.com - Vidéos Féminin Décoration Wat.tv. La vidéo Pêle-mêle déco, par Stéphanie LECLERC de tendancedecotv est sur tendancedecotv wat.. soccer number 10 official site . Soccer Number 10 Official Site: Specializing in soccer number 10 training services. Soccer number 10 dribbling and soccer skills. Soccer number 10 Blue Print Training . pelé faz o último gol pela seleção brasileira no msn vídeo. O melhor jogador de todos os tempos tem seu pedido atendido: Pelé faz seu último gol com a camisa 10 pela Seleção Brasileira. Com criação da Y&R e produção da . seneweb news video pelé à londres 2 heures d'attente et une . VIDEO - Pelé à Londres: 2 heures d'attente et une fuite par la porte de service. unida soccer club home. Offers soccer programs for the youth and the disadvantaged children. News, teams, coaches and contacts. Millington.. fotos de pele video pele biografía pelé videos futbol pele . Fotos de pele, video pele, Biografía Pelé, videos futbol pele, vida de pele, videos de brasil pele, goles de pele, maradona pele, pele maradona. shut up pele world does not want the cheap football hero like you . Pele's Neymar praises began to cloy, someone should tell him shut his mouth.. video limited edition pele trinity 3e designed by sheone . Pele Sports got together with the London based designer SheOne, and let him do his thing on a Trinity 3E. The boot is now available in very limited.. video pelé fue la sorpresa de brasil en la clausura de londres 2012. ElComercio.pe; Deportes; domingo 12 de agosto del 2012 20:09 VIDEO: Pelé fue la sorpresa de Brasil en la clausura de Londres 2012. La delegación de Río de Janeiro . thousands gather to see pele in london – video. LONDON – More than 1,000 people gathered in droves in front of a sporting good store at London's famous Carnaby Shopping Street with hopes of getting a glimpse of their soccer legend. Pele, a living soccer legend, was to . video pele strikes global partnership with mediacom media week. Read VIDEO: Pele strikes global partnership with MediaCom & other Media Week news online. VIDEO: Pele strikes global partnership with MediaCom from Media Week. Media Week magazine - news and information from . video pele strikes global partnership with mediacom david . Tweet · Tweet. MediaCom has unveiled a four-year global partnership with Pele spanning the 2014 World Cup and the 2016 Olympics in Brazil through Legends 10, the exclusive global agent to the legendary Brazilian . pelÉ 70 anos lances históricos em copas do mundo youtube. Imagens, lances e gols históricos de Pelé em Copas do Mundo, numa pequena homenagem ao Rei do Futebol no dia em que o mundo festeja 70 anos da lenda do . video pelé made u s and new york cosmos debut 37 years ago. In June of 1975, Pelé assisted on one goal and scored another on a header to help lead his New York Cosmos team to a comeback draw against the Dallas Tornado.. video #39;pele#39; reacts to anderson silva#39;s book calls #39;the spider#39; a liar . MMAmania.com - by Jesse Holland "I feel I'm in a pathetic situation here, having to answer to this well-known fighter who has lied about me and about some facts of our lives. Anderson, you know how I deal with this kind of . video #39;pele#39; reacts to anderson silva#39;s book calls #39;the spider#39; a liar . Anderson Silva is getting attacked by someone who hates his guts. And for once, it's not Chael Sonnen..


text:
Tuesday, Nov. 13, 2012 7 p.m. to 8 p.m.
Location: Lee Community Hall (Rm 133), Wishcamper Center, USM Portland Campus, 34 Bedford St., Portland, Maine
For more information: Kyle Radke; (207) 780-4563; firstname.lastname@example.com
Muskie School Fall Lecture Series presents "Maine DHHS: Challenges and Opportunities" with Mary Mayhew on Tuesday, November 13 at University of Southern Maine. Mary Mayhew, commissioner of the Maine Department of Health and Human Services (DHHS), will address the department's vision of the future, the challenges that are facing Maine's Medicaid program, and the opportunities that exist to transform the way services are delivered. Lecture starts at 6:45 p.m. For more info: http://usm.maine.edu/cmhs/muskie-school-fall-lecture-series-mary-mayhew-maine-dhhs-challenges-and-opportunities.


text:
All CityView Summer Camps are held on premises and are day camps. For Registrants from out of town, the program can assist in arranging accommodations for the week. All camps are from Monday to Friday. Participants must pack their own lunch.
2 PM to 6:30 PM
9 AM to 2 PM
Hisham Ashour
Omar Mohy
Andrew Wagih
Thaisa Serafini
Ona Prokes
CityView offers 4 International Squash Courts for member rental as well as a full menu of Squash Programming. CityView Squash is headed by Director Raymond Zananiri who brings 10 years of experience of the highest level in Squash Programming.
HASA is the centerpiece of CityView Racquet Club Squash Program. It is dedicated to providing outstanding Squash Programming for Juniors . HASA was founded by former World # 11 and one of the World most prominent coaches, Hisham Ashour.
A group class setting intended to be the core training method for Juniors.
Staff Level: Hisham Ashour
$120/1hr, $180/1.5hrs
Staff Level: Advanced
$100/1hr, $150/1.5hrs
Staff Level: Club Level
$80/1hr, $120/1.5hrs
Staff Level: Club Level
The fundamentals of form and technique $80/1hr, $120/1.5hrs
Staff Level: Advanced
A workshop specializing in decision making and shot selection in matches $100/1hr, $150/1.5hrs
Scheduling is based on careful matching of participants. Please contact Squash Director to inquire.
Registration for clinics is for entire term. Partial enrollment not permitted. New participants can register after first day of term and be prorated for the all remaining sessions of term.
(*) School holiday. Squash Program off. Private sessions can be arranged privately with coach on school holidays.
Private lessons focus on specific technical challenges with form or when matching a junior in a clinic setting proves difficult.
Therefore they are meant to compliment Junior Clinics rather than an exclusive mode for training. Privates are scheduled through the Squash director. Please contact for inquiries. All Privates Lessons are 45 minutes. One hour privates can be specially arranged based on availability and with pricing adjustments.
|Private Lessons (45 Minutes)
|Hisham Ashour
|Andrew Wagih (Advanced Staff)
|Omar Mohy (Advanced Staff)
|Club Level 2 Staff
|Club Level 1 Staff
A comprehensive weekend training session and a perfect platform for Juniors to hone their skills and implement what was learned in practice.
Open to all juniors, within or outside the program
– Drill Sets
– Fitness
– Match Play (75% of session)
1 PM to 3 PM
1 PM to 4 PM
Omar Mohy
Andrew Wagih
Thaisa Serafini
Ona Prokes
Drop-ins welcome. RSVP highly recommended. Contact Squash Director for registration
All CityView Summer Camps are held on premises and are day camps. For Registrants from out of town, the program can assist in arranging accommodations for the week. All camps are from Monday to Friday. Participants must pack their own lunch.
2 PM to 6:30 PM
9 AM to 2 PM
Hisham Ashour
Omar Mohy
Andrew Wagih
Thaisa Serafini
Ona Prokes
CityView Junior Squash integrates fitness and strength training within the daily schedule of Junior Squash training. Sessions are held from 4 PM to 6 PM, Monday to Thursday (or by appointment).
Conducted by coach Ona Prokes.
Session: 25 mins | $20
CityView van system: CityView Club provide van pickup and drop off to and from Manhattan to the club. Pickup is typically at 3:15 to 3:20 PM for arrival at the club at 4 PM. Departure from the club is at 5:30 for drop off to desired locations in Manhattan. Please check availability and pricing with
Paula Cia at email@example.com
Subway from Manhattan: 7 (Local) train to 33rd Street/Rawson Street station.
NY Squash organizes competitive Squash leagues between the different clubs in NYC. CityView teams of different skill levels have been avid competitors in the NY Squash leagues, winning multiple championships over the years. NY Squash organizes competitive Squash leagues between the different clubs in NYC. CityView teams of all skill levels have been avid competitors in the NY Squash leagues, winning multiple championships over the years. New CityView members are encouraged to join the roster of the appropriate skill level teams. This is a great way to be introduced to many players of your level and play/compete within the spirit of team.
To join NY Squash League please contact the Squash Director, Raymond Zananiri at email@example.com
Founder and head of Hisham Ashour Squash Academy. He reached a career-high world ranking of World No. 11 in February 2012. Hisham is considered one of the top Squash coaches in the World. His Academy's mission is to provide the most effective and complete training program possible for juniors.
Egypt's Andrew Wagih Shoukry joined the PSA World Tour in 2007 and is coached by former World No.1 Karim Darwish. He claimed his first PSA World Tour title the same year at the Kengen Parklands Open and followed that up with two further titles in a successful 2010. His fifth PSA World Tour title came at the Tour de las Americas – Regatas de Resistencia Open in May 2012. More high finishes at a number of events over the year meant that Andrew would climb into the world's top 50 for the first time in March 2013. While basing his training at CityView Racquet club, Andrew is available for coaching top tear juniors in the US.
Comes from the Elite Wadi Degla Academy in Egypt, where for three years he excelled as a coach there, winning 3 league titles and nurturing many junior champions. He was also part of World # 6 Tarek Momen's coaching team that helped him reach the World Open semi-finals. He has also trained World #1 Raneem El Weleily. Besides his outstanding technical expertise, Omar likes to focus on the mental game of his players, which he regards as the secret to success in Squash.
CityView Squash Program boasts 4 International Singles Courts Court Rental is available for members and their guests.
(Per 45 minutes court period)
$20 Prime time ($10 per player)
$10 Non-Prime time ($5 per player)
Weekdays: from 3:15 PM to 9:15 PM
Weekends: from 8:30 AM to 4:00 PM
To reserve courts, please contact Front Desk at (718) 389-6252
For Squash Membership inquiries, please contact :
Membership Services Director
Please direct all inquiries to:
Squash Director
email@example.com Club Phone (718) 389-6252


text:
Partner Space Share
Business By confectionaryperfection Updated 17 Jan 2012 , 1:23am by msthang1224
Hi everyone, I found a perfect ready to go location in nj and was wondering if there was anyone who wanted to share a legal bakery space? The rent is unbelievably cheap and it is such great place....I can't do it alone thou. I don't have that much business yet but have been doing it for years and closed my shop, now I'm ready to re-open.
Wow, wish I Lived in NJ bc i would look into joining you
Quote by @%username% on %date%


text:
What is JotForm?
JotForm is a free online form builder which helps you create online forms without writing a single line of code. No sign-up required.
At JotForm, we want to make sure that you're getting the online form builder help that you need. Our friendly customer support team is available 24/7.
We believe that if one user has a question, there could be more users who may have the same question. This is why many of our support forum threads are public and available to be searched and viewed. If you'd like help immediately, feel free to search for a similar question, or submit your question or concern.
How to reduce form height?Asked by WebsiteAdmin on September 23, 2013 at 04:31 PM
I have emebbed form on left sidebar on www.powerofsales.org however its seems to be too long, is there any way to shortern it.
thank you
JotForm Support
You can reduce the height of your form by changing the height of the iFrame to size that you would like, currently it is 887px.
<iframe id="JotFormIFrame" onload="window.parent.scrollTo(0,0)" allowtransparency="true" src="//form.jotformpro.com/form/32655910375255" frameborder="0" style="width:100%; height:887px; border:none;" scrolling="no"></iframe>
You will also need to inject CSS on your form to adust the fields when the height is adjusted. The CSS below worked for me when I tested your form with a height of 645px. Please review this guide for more information on how to inject css.
.form-line {
padding: 0px !important;
.form-line-column {
width: 100% !important;
#input_7 {
width: 85% !important;
#cid_8 {
width: 75% !important;
I hope this helps! Please let us know if you have any further assistance.


text:
Clip Art Christmas Borders is free HD wallpaper. This wallpaper was upload at June 17, 2016 upload by schoolclipart in Clip Art Borders.You can download it in your computer by clicking resolution image in Download by size:. Don't forget to rate and comment if you interest with this wallpaper.
#christmas clipart borders#clipart christmas borders#clipart christmas borders and frames#clipart christmas borders free downloads


text:
Summer French Alps Family Holiday(10 Posts)
TeamBrown Sun 19-Aug-12 18:18:32
SummerLightning Mon 20-Aug-12 09:15:23
SummerLightning Mon 20-Aug-12 16:50:09
TeamBrown Wed 22-Aug-12 09:41:38
hf128219 Thu 23-Aug-12 07:42:29
TeamBrown Thu 23-Aug-12 08:21:13
SummerLightning Thu 23-Aug-12 10:43:42
TeamBrown Wed 29-Aug-12 20:01:30
TheLightPassenger Wed 29-Aug-12 20:15:39
Wifepot Mon 04-Feb-13 12:02:55
Join the discussion
Registering is free, easy, and means you can join in the discussion, get discounts, win prizes and lots more.Register now
Already registered with Mumsnet? Log in to leave your comment or alternatively, sign in with Facebook or Google.
Please login first.


text:
Accommodations in São Bento Do SapucaíSee All
If you are looking for travel information of São Bento Do Sapucaí in Brazil, you've come to the right place. When planning a trip to São Bento Do Sapucaí, make sure you visit its near-by prime city of Campos Do Jordao. Add Campos Do Jordao to your vacation plan, it has an interesting bunch of activities to do on your visit like Morro Do Elefante, Ducha De Prata, Amantikir Jardins. Tour packages of São Bento Do Sapucaí are of 1 to 2 days duration.
São Bento Do Sapucaí is an affair to remember, follow this apt itinerary of the place and return home with a bunch of memories.
Explore the best journey planner for your visit to São Bento Do Sapucaí and create a flawless plan in few simple steps!


text:
Hey everyone, I just wanted to see if any other users on the wiki had checked out the James Cameron's Avatar Answers Wiki in a while. The main reason I'm asking is... well, there's 2 reasons:
- There are very few answerers and a lot of questions to be answered.
- There appears to be a glitch ... I went to answer 2 questions on it today and when I clicked "Save", it erased what I had and returned to the question before it had been answered.
Anyways, just curious. Thanks, everyone!! :)


text:
The manufacturer's ice machines are protected by HoshiGuard antimicrobial agent. Permanently embedded in select components of the ice machine during the manufacturing process, the agent protects the inside of the ice machine as well as the scoop. HoshiGuard uses advanced antimicrobial technology to inhibit the growth of bacteria, mildew, mold, and other microorganisms that can cause odors, discoloration, and deterioration of products. This technology is U.S. FDA, NSF, EU, EFSA, and Health Canada HPFB approved.
Hoshizaki America Inc., 618 Hwy 74 South, Peachtree City, GA 30269; 800-438-6087 or 770-487-2331; 770-487-1325 (fax); email@example.com; www.hoshizakiamerica.com


text:
Inspiration Point
Both abundance and lack exist simultaneously in our lives, as parallel realities. It is always our conscious choice which secret garden we will tend… when we choose not to focus on what is missing from our lives but are grateful for the abundance that's present the wasteland of illusion falls away and we experience Heaven on earth. – Sarah Ban Breathnach, author, Simple Abundance


text:
Shiv Inn
Call us 1800-300-2400-1 (Toll Free) and Get additional Discount upto 50% for this Hotel.
You are getting lowest possible rate for this hotel
- About Hotel
- Reviews
About Shiv Inn
Shiv Inn hotel offers an open-air restaurant. The Talegaon Dabhade Railway Station is located 2 km away from the property. This budget hotel in Pune accommodates 12 centrally air-conditioned rooms spread on 2 floors. Amenities offered in each room are television, wardrobe, separate sitting area, wake-up calls, and attached bathroom with hot/cold running water facility and a shower.
No of floors: 2 | No of rooms: 12
Checkin Time: 1200 pm
Checkout Time: 1200 pm
Hotel Amenities
- Restaurant
- Medical Services
- Parking
- Room Service
- Front Desk
- Laundry Facilities
- Separate Sitting Area
- H/C Running Water
- Bottled/drinking Water
- Television-Room
- Attached Bathroom


text:
It only takes a minute to get started. Fill out our uncomplicated sign up form and login to the website.
This step is elective but will seriously raise your chances of receiving views from other daters on the website. Write a little about yourself, your hobbies and upload some good photographs of yourself.
Utilise our website's state-of-the-art search to spot members who fulfill your criteria. Or just flip through listings and spot people that you find attractive.
Discovered someone who ticks all the boxes? Send them a few words or just a wink and let it develop from there. With a little luck you'll be on your way to uncover your proper partner.
It's really quick


text:
1. Nyx soft matte lip cream – Morocco.
I love the texture, it is easier to work with than a liquid lipstick, it has great staying power, it stains your lips, plus it smells like cake. It is a super bright orange with tons of red on it, great for the warmer seasons.
2. Jordana matte lipstick – Tangerine Tango
This one has great staying power especially if used with a lipliner. I have to admit this lipstick might not be for everyone, it feels pretty drying on the lips, something I quiet like, but if you want to give this one a try and you hate that feeling, just use some lipbalm before applying it.
3. Revlon Just Bitten Kissable Balm Stain – Rendezvous
Revlon's balm stains are awesome and there is a great selection of colors, Rendezvous being my go-to lipstick. They last all day and if you need to retouch it, it still looks super fresh. I find that it only wears off when I eat or drink, but it fades to a really pretty orange stain that will last all day.
4. Maybelline Color Elixir Ligloss – Mandarin Rapture
This is a sheer lipgloss with a little pigment on it. The smell is nice and fruity, but they do not have a great staying power, it only lasts one to two hours on me. This is my "I want to wear orange lipstick but I'm only going to school" kind of product and it is the only lipgloss I tolerate. The only two things I don't like are that it feels kind of sticky and has some shimmer particles on it.
5. Maybelline Color Sensational Vivids – Electric Orange
I don't find this exact shade to be extremely pigmented but it has a nice color payoff, it has a glossy finish, it lasts a long time and I love how it looks like straight orange, instead of looking red.
Which are your favorite orange lipsticks? I would love to know!


text:
This may seem like a strange request at first but im sure people will agree that this has the potential to save alot of wasted energy, and ensure greener IT environments - whilst optimising employee time in the morning.
We operate a large number of servers and desktop computer that have relatively structured usage patterns - most of which are around standard business working hours. We are yet to invest in substantial Virtualisation so the majority of our server fleet are physical machines.
What i am trying to achieve is the ability to automatically turn on desktop computer before employees arrive in the morning (reducing their time wastage when the computer is booting), if someone doesnt log on to the machine within a set period (i.e. 1 hour) auotmatically shutdown the computer to save energy.
Moreso i would like to extend this feature to our servers, in that at night there are several servers that are not required to be running once their backup/nightly processes are complete, and more so over the weekend we can scale back our servers - in particular our citrix servers, and test environment machines.
The ultimate goal is to have this built into a scheduler that sends WOL packets to the machine to wake them up when needed, and then use some queries to determine if a workstation is in use, and if not utilise the shutdown command to turn it off. Hence requiring no client based software.
Given the requirement of a MAC address for WOL, i see that Spiceworks already has this information and as such would be the ideal candidate for the scheduling tool needed to achieve this.
Has anyone thought about this or seen anything that may assist with this? Alternatively is anyone interested to work collectively on this to deliver a solution, and hopefully have this integrated into Spiceworks - either natively or via a plugin (if this is possible).
I look forward to hearing your feedback!
Thanks for your interest,
This topic was created during version 4.1.
The latest version is 7.5.00101.
1 Reply
Oct 7, 2009 at 12:37 UTC
Hi Regan,
This is a great idea. There is new functionality being built in to the next release of Spiceworks that will be the beginnings of what you are referring to (see Francis' post here).
In the future Spiceworks will have a closer level of integration with power management on vPro enabled devices.
If you want to see improved functionality, or specific features please create/spice up related posts in the Feature Request forum.
This discussion has been inactive for over a year.
You may get a better answer to your question by starting a new discussion.