今天写了一个关于Java EE 7 Batch 的Demo,该Demo是实现将文件中的用户欠费信息分批处理,最终输出到控制台,部分代码设计如下:
MyItemReader:
@Named
public class MyItemReader extends AbstractItemReader {
private BufferedReader reader;
static int COUNT = 0;
@Override
public void open(Serializable checkpoint) throws Exception {
reader = new BufferedReader(
new InputStreamReader(
this
.getClass()
.getClassLoader()
.getResourceAsStream("/META-INF/mydata.txt")
)
);
}
@Override
public String readItem() {
try {
String s = reader.readLine();
COUNT++;
return s;
} catch (IOException ex) {
Logger.getLogger(MyItemReader.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
}
MyItemProcessor:
@Named
public class MyItemProcessor implements ItemProcessor {
@Override
public Message processItem(Object item) throws Exception {
// TODO Auto-generated method stub
StringTokenizer tokens = new StringTokenizer((String)item, ",");
String name = tokens.nextToken();
float money;
money = Float.valueOf(tokens.nextToken());
User user = new User(name,money);
Message m = new Message();
m.setContent("尊敬的" + user.getName()
+ ",您好!您当前欠费:"+ user.getMoney() +" 请尽快交费,以免影响您的正常通话!谢谢!");
return m;
}
}
MyItemWriter:
@Named
public class MyItemWriter extends AbstractItemWriter {
@Override
public void writeItems(List list) {
/* System.out.println("writeItems: " + list);
for (Object person : list) {
em.persist(person);
}*/
System.out.println("通知:");
for (Object m : list) {
System.out.println(((Message)m).getContent());
}
}
}
测试的servlet:
@WebServlet(urlPatterns = {"/TestServlet"})
public class TestServlet extends HttpServlet {
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("<html>");
out.println("<head>");
out.println("<title>CSV-to-Database Chunk Job</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>CSV-to-Database Chunk Job</h1>");
JobOperator jo = BatchRuntime.getJobOperator();
long jid = jo.start("myJob", new Properties());
out.println("Job submitted: " + jid + "<br>");
out.println("<br><br>Check server.log for output, also look at \"myJob.xml\" for Job XML.");
out.println("</body>");
out.println("</html>");
} catch (JobStartException | JobSecurityException ex) {
Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);
}
}
........
测试结果:
19:31:27,748 INFO [stdout] (batch-batch - 3) 通知:
19:31:27,748 INFO [stdout] (batch-batch - 3) 尊敬的 User1,您好!您当前欠费:11.0 请尽快交费,以免影响您的正常通话!谢谢!
19:31:27,749 INFO [stdout] (batch-batch - 3) 尊敬的 User2,您好!您当前欠费:21.0 请尽快交费,以免影响您的正常通话!谢谢!
19:31:27,749 INFO [stdout] (batch-batch - 3) 尊敬的 User3,您好!您当前欠费:22.0 请尽快交费,以免影响您的正常通话!谢谢!
19:31:27,749 INFO [stdout] (batch-batch - 3) 尊敬的 User4,您好!您当前欠费:23.0 请尽快交费,以免影响您的正常通话!谢谢!
19:31:27,750 INFO [stdout] (batch-batch - 3) 尊敬的 User5,您好!您当前欠费:24.0 请尽快交费,以免影响您的正常通话!谢谢!
19:31:27,750 INFO [stdout] (batch-batch - 3) 通知:
19:31:27,751 INFO [stdout] (batch-batch - 3) 尊敬的 User6,您好!您当前欠费:25.0 请尽快交费,以免影响您的正常通话!谢谢!
19:31:27,751 INFO [stdout] (batch-batch - 3) 尊敬的 User7,您好!您当前欠费:26.0 请尽快交费,以免影响您的正常通话!谢谢!
19:31:27,751 INFO [stdout] (batch-batch - 3) 尊敬的 User8,您好!您当前欠费:27.0 请尽快交费,以免影响您的正常通话!谢谢!
19:31:27,752 INFO [stdout] (batch-batch - 3) 尊敬的 User9,您好!您当前欠费:28.0 请尽快交费,以免影响您的正常通话!谢谢!
19:31:27,752 INFO [stdout] (batch-batch - 3) 尊敬的 User10,您好!您当前欠费:29.0 请尽快交费,以免影响您的正常通话!谢谢!