我正在尝试使用log4j发送包含来自后台进程的日志记录语句的可通过电子邮件发送的报告.我想为每个进程运行发送一封电子邮件,而不是每封邮件声明都发送一封电子邮件 我看过了SMTPAppender,但是没有看到在流程完成时手动发送报告的方法.我相信这TriggeringEventEvaluator可能是关键,但我遇到的一个问题是如何获取TriggeringEventEvaluator实例的句柄.我坚持使用log4j 1.2.14并且该SMTPAppender.getEvaluator()方法在1.2.15中引入.有什么想法吗?我是否走在正确的轨道上?这种SMTPAppender.close()方法在这里发挥作用吗?
我希望能够这样做:
log.info(message1);
log.info(message2);
log.info(message3);
log.sendMail();
Run Code Online (Sandbox Code Playgroud)
在考虑了这个之后,我想我需要澄清一下我希望完成的事情.我正在尝试捕获运行石英作业的日志记录,并将生成的日志作为电子邮件发送.quartz工作将一堆服务方法调用到各种服务中.我想要包括那些服务方法执行的任何日志记录以及石英作业本身的日志记录.我以为我可以执行类似以下操作来捕获所有日志记录,但它无法正常工作.
// at the beginning of quartz job
Logger logger = Logger.getRootLogger();
StringWriter sw = new StringWriter();
WriterAppender wa = new WriterAppender(new SimpleLayout(), sw);
logger.addAppender(wa);
// at the end of the quartz job
String report = sw.toString();
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用apache-commons net FTP lib从FTP服务器获取.如果目录中只有1个文件,代码工作正常,但是第二次调用retrieveFileStream()时总是返回null.有什么想法吗?我编写了以下示例代码来演示我的问题.
public static void main(String[] args) throws Exception
{
String strLine;
FTPClient client = null;
try{
client = new FTPClient();
client.connect("localhost", 21);
client.enterLocalPassiveMode();
client.login("ftptester", "letmein");
client.changeWorkingDirectory("remote");
FTPFile[] ftpFiles = client.listFiles();
if (ftpFiles != null && ftpFiles.length > 0) {
for (FTPFile file : ftpFiles) {
if (!file.isFile()) {
continue;
}
InputStream fin = client.retrieveFileStream(filepath);
if (fin == null) {
System.out.println("could not retrieve file: " + filepath);
continue;
}
byte[] data = readBytes(fin); // helper method not shown, …Run Code Online (Sandbox Code Playgroud) 使用Struts 2.3.15.1
在struts2中实现文件上传.这是我已经多次做过的事情,但是,我试图包括一些健全性检查(主要是最大文件大小).我将fileUpload拦截器作为我的堆栈中的最后一个拦截器(即struts.xml).我的堆栈包括一些内部拦截器以及validationWorkflowStack.我在struts.properties文件中设置了以下属性:
struts.multipart.maxSize = 2000000
Run Code Online (Sandbox Code Playgroud)
除了文件上传之外,我还在表单中传递了一些其他参数.表格定义为:
<s:form action="addResource" method="post" enctype="multipart/form-data">
<s:hidden name="rfqId" value='%{rfq.id}' />
<s:file name="uploadFile" id="uploadFile" label="File" size="40" value=""/>
....
</s:form>
Run Code Online (Sandbox Code Playgroud)
我相信大家都知道,validationWorkflowStack包含了params拦截器,它将请求参数设置为动作.这是问题,当上传的文件超过maxSize时,params拦截器没有设置的参数.我已经介入了,而actionContext中没有任何内容.这不好,因为我需要那些参数来处理将导致的INPUT错误.
我错过了什么吗?
我试图坚持一个具有我想要从DB序列填充的属性的实体.我正在使用Oracle,创建了序列,通过sql验证了序列的工作原理,但我的属性却没有填充.这就是我所拥有的:
@GeneratedValue(generator = "RFQ_LINE_IDS_SEQUENCE", strategy=GenerationType.SEQUENCE)
@SequenceGenerator(name="RFQ_LINE_IDS_SEQUENCE", sequenceName="RFQ_LINE_IDS_SEQUENCE", allocationSize=1000000000)
@Column(name = "external_line_item_id")
private String externalLineItemId;
Run Code Online (Sandbox Code Playgroud)
我在网上看到的所有例子都显示这个注释与@Id一起使用,但我有另一个属性,我正在使用我的id.
我也试过以下无济于事:
@GeneratedValue(generator = "RFQ_LINE_IDS_SEQUENCE", strategy=GenerationType.SEQUENCE)
@GenericGenerator(name = "RFQ_LINE_IDS_SEQUENCE", strategy = "sequence",
parameters = {@Parameter(name = "sequence", value = "RFQ_LINE_IDS_SEQUENCE")})
@Column(name = "external_line_item_id")
private String externalLineItemId;
Run Code Online (Sandbox Code Playgroud) 我成功地对我的一个struts2映射文件使用了重定向操作,如下所示:
<action name="setAsCurrentCart" class="com.fmp.MyAction">
<result name="success" type="redirect-action">
<param name="actionName">myOtherAction</param>
<param name="foo">${foo}</param>
</result>
<interceptor-ref name="defaultComponentStack"/>
</action>
Run Code Online (Sandbox Code Playgroud)
这是我想做的事情:
<action name="setAsCurrentCart" class="com.fmp.MyAction">
<result name="success" type="redirect-action">
<param name="actionName">myOtherAction</param>
<param name="${dynamicParameterName}">${dynamicParameterValue}</param>
</result>
<interceptor-ref name="defaultComponentStack"/>
</action>
Run Code Online (Sandbox Code Playgroud)
换句话说,我希望我传递的参数的名称是动态的.有谁知道这是否可能?
我正在尝试使用EasyMock和TestNG编写一些单元测试,并遇到了一个问题.鉴于以下内容:
void execute(Foo f) {
Bar b = new Bar()
b.setId(123);
f.setBar(b);
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试以下列方式测试Bar的ID是否相应地设置:
@Test
void test_execute() {
Foo f = EasyMock.createMock(Foo.class);
execute(f);
Bar b = ?; // not sure what to do here
f.setBar(b);
f.expectLastCall();
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中,我不能只是调用f.getBar()并检查它的Id,因为它f是一个模拟对象.有什么想法吗?这是在那里我想看看EasyMock的V2.5增加andDelegateTo()和andStubDelegateTo()?
哦,只是为了记录... EasyMock的文档打击.