バッチ処理(Dropwizard の
テンプレートエンジンを
Wicket の
正直かなり
前提
- Wicket version 7.6.0 を
使用して 動作確認は 実施しました。
<dependency> <groupId>org.apache.wicket</groupId> <artifactId>wicket-core</artifactId> <version>7.6.0</version> </dependency>
参考記事
Wicket を TemplateEngine と して 使う
Wicket の
Wicket Examples - Render mail templates
Example では
以下、
Page を Template と して 使う
PageProvider、
PageProvider pageProvider = new PageProvider(TemplateBasedOnPage.class, parameters); CharSequence pageHtml = ComponentRenderer.renderPage(pageProvider);
Panel を Template と して 使う
ComponentRenderer.renderComponent() を
CharSequence panelHtml = ComponentRenderer.renderComponent(new MailTemplatePanel("someId", new PropertyModel<String>(MailTemplate.this, "name")));
txt ファイルを Template と して 使う
PackageTextTemplate を
PackageTextTemplate template = new PackageTextTemplate(MailTemplate.class, "mail-template.tmpl"); CharSequence templateHtml = template.asString(variables);
バッチ処理内で、 PackageTextTemplate を 使用する
Batch 処理 (WARアプリケーションではない。PackageTextTemplate
を
- createMessageメソッド
private String createMessage(ContactMailTaskManage entity) throws IOException { String message = null; MockApplication mock = new MockApplication(); ThreadContext.setApplication(mock); mock.setName("BATCH"); mock.setServletContext(new MockServletContext(mock, "")); mock.initApplication(); try (TextTemplate textTemplate = new PackageTextTemplate(this.getClass(), "inqueryMailTmpl.txt")) { Map<String, Object> vars = new HashMap<String, Object>(); vars.put("name", entity.getName()); vars.put("emailAddress", entity.getEmail()); vars.put("subject", entity.getSubject()); vars.put("message", entity.getMessage()); message = textTemplate.asString(vars); } catch (IOException e) { throw e; } return message; }
- 説明 以下の
記述で、 MockApplication を 生成して、
ThreadContextに設定しています。 上記をMockApplication mock = new MockApplication(); ThreadContext.setApplication(mock); mock.setName("BATCH"); mock.setServletContext(new MockServletContext(mock, "")); mock.initApplication();
実行しないと、 ThreadContextに、 紐づく Applicationが 存在しない 状態に なり、
リソース取得時に以下の エラーが 発生します。 これでは! org.apache.wicket.WicketRuntimeException: There is no application attached to current thread main ! at org.apache.wicket.Application.get(Application.java:235) ! at org.apache.wicket.util.template.PackageTextTemplate.load(PackageTextTemplate.java:195) ! at org.apache.wicket.util.template.PackageTextTemplate.getString(PackageTextTemplate.java:255) ! at org.apache.wicket.util.template.TextTemplate.asString(TextTemplate.java:72)
まっていたのですが、 Wicket の テストクラスで、 MockApplicationの 設定記述が あったので、
そちら参考に 実装して 上手く 動かすことができました。
無理矢理なので、 TextTemplate を 継承実装して、 無理矢理感を なくす。
記事を
別の
Application に
以下、
- createMessageメソッド
private String createMessage(ContactMailTaskManage entity) throws IOException { String message = null; try (TextTemplate textTemplate = new TextTemplate("text") { private InputStream is; private BufferedReader br; private InputStreamReader isr; @Override public String getString() { is = this.getClass().getResourceAsStream("inqueryMailTmpl.txt"); isr = new InputStreamReader(is); br = new BufferedReader(isr); StrBuilder sb = new StrBuilder(); br.lines().forEach(line -> { sb.appendln(line); }); return sb.toString(); } @Override public TextTemplate interpolate(Map<String, ?> map) { throw new UnsupportedOperationException("Not support.."); } @Override public void close() { IOUtils.closeQuietly(is); IOUtils.closeQuietly(isr); IOUtils.closeQuietly(br); } }) { Map<String, Object> vars = new HashMap<String, Object>(); vars.put("name", entity.getName()); vars.put("emailAddress", entity.getEmail()); vars.put("subject", entity.getSubject()); vars.put("message", entity.getMessage()); message = textTemplate.asString(vars); } return message; }
説明1 TextTemplate の
getString メソッド、 interpolate メソッドを 実装した インナークラスを 作成しました。
interpolate
は、TextTemplate#asString() を 使う 限りは、 呼び出されないので、 例外を スローする 実装に しました。 説明2 TextTemplateは、
Closeable
をimplementsしているので、 closeメソッドを 実装する 必要が あります。 説明3 getString() の
呼び出し毎に、 ファイルを 取得しに いく 必要は ないので、 パフォーマンスと しては 改善の 余地は あるように 思います。
Application クラスに
Panelなども、
他にも
コメント