我想通过使用JCabi手动调用方法重试.面向方面的编程应该让这很容易,但我无法弄清楚.
import com.jcabi.aspects.RetryOnFailure;
public class Example
{
public int j;
@RetryOnFailure(attempts = 4, delay = 100, verbose = true)
public void retryFun() throws Exception
{
j++;
if(j<3)
throw new Exception();
else
return;
}
public static void main(String[] args) throws Exception
{
Example example = new Example();
System.out.println(example.j);
example.retryFun();
System.out.println(example.j);
}
}
Run Code Online (Sandbox Code Playgroud)
jcabi提供的唯一示例是下面的示例,它不显示如何抛出异常以强制重试调用:
使用@RetryOnFailure注释注释您的方法,如果方法中有异常,它的执行将重复几次:
Run Code Online (Sandbox Code Playgroud)public class Resource { @RetryOnFailure(attempts = 2, delay = 10, verbose = false) public String load(URL url) { return url.openConnection().getContent(); } }在发生异常时,该方法将重试两次,尝试之间延迟10毫秒.
我正在注释我的函数@Loggable jcabi注释.它记录的语句不完整,它修剪了行,只打印..为截断的数据.我希望打印整行.可以使用此注释完成此操作.
@Loggable(Loggable.DEBUG)
public String load(URL url) {
return url.openConnection().getContent();
}
Run Code Online (Sandbox Code Playgroud)
生成以下日志
[DEBUG] #load('http://www.google.com'): returned "<html ..." in 23ms
Run Code Online (Sandbox Code Playgroud)
Log4j.properties
# Root logger option
log4j.rootLogger=INFO, file, CONSOLE
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=swami-plugin.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=com.jcabi.log.MulticolorLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%color{%-5p}] %c: %m%n
Run Code Online (Sandbox Code Playgroud) 我正在尝试按照http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html上的指南缓存方法接口中包含的慢速网络调用的结果
我正在使用 netflix feign 客户端进行网络调用并用于com.jcabi.aspetcts.Cacheable缓存此方法的结果。
@Headers("Accept: application/json")
public interface ApiSolutionClient {
@Cacheable(lifetime = 30, unit = TimeUnit.MINUTES)
@RequestLine("GET /v1/solutions?param1={param1}¶m2={param2})
List<Solutions> getSolutions(@Param("param1") Param1 param1, @Param("param2") Param2 param2);
}
Run Code Online (Sandbox Code Playgroud)
如果我在 30 分钟内重复调用此方法,则不会从缓存中获取数据,而是再次重复网络调用(我也在观察服务器日志)。
如何让它缓存结果而不是再次执行方法体?
我厌倦了添加手动日志来调试我编写的每个方法。
我开始了解jcabi 的@Loggable注释,但没有成功实施,非常感谢您的帮助。
下面是我尝试过的代码。
import com.jcabi.aspects.Loggable;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Jcabi {
@Loggable
private static String checkJcabi(String stringToPrint) {
log.info("Print Successfull");
return stringToPrint;
}
public static void main(String[] args) {
checkJcabi("Hello World!");
}
}
Run Code Online (Sandbox Code Playgroud)
IDE 控制台打印:
[main] INFO com.amazon.optimus.cpamutil.utils.Jcabi - Print Successfull
Run Code Online (Sandbox Code Playgroud)
这是log.info()我在方法中添加的日志,并且没有@Loggable像这篇文章中提到的这样(下面)的注释日志
[INFO] com.example.Foo #power(2, 10): 1024 in 12?s
[INFO] com.example.Foo #power(3, 3): 27 in 4?s
Run Code Online (Sandbox Code Playgroud)
以下是我使用的依赖包:
JCabiAspects = 1.0;
方面J = 6.0;
Slf4j = 1.7;
Slf4j_Simple = 1.7; …
我努力寻找一个简单的代码行,它使用oauth令牌从企业github读取文件内容,但是找不到这样的例子.
我试过https://github.com/jcabi/jcabi-github,但它不支持企业github?(也许我错了)
现在我正在尝试自我:
GitHubClient client = new GitHubClient("enterprise url");
GitHubRequest request = new GitHubRequest();
request.setUri("/readme");
GitHubResponse response = client.get(request);
Run Code Online (Sandbox Code Playgroud)
那又怎样?我只看到了一个getBody,也许我需要用一些json库来解析它?它必须更简单..我期待的东西像:repo.get(url).getContent()
我正在尝试使用 Maven 和 Jcabi-Aether 获取/解决一些工件。我想我已经准备好了大部分代码,但是我很难弄清楚如何加载用户,settings.xml以便我可以将 Maven 存储库加载到remotes变量中以供 Aether 使用:
import com.jcabi.aether.Aether;
import java.io.File;
import java.util.Arrays;
import org.apache.maven.project.MavenProject;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.util.artifact.DefaultArtifact;
public class Main {
public static void main(String[] args) {
File local = new File("/tmp/local-repository");
Collection<RemoteRepository> remotes = Arrays.asList(
new RemoteRepository(
"maven-central",
"default",
"http://repo1.maven.org/maven2/"
)
);
Collection<Artifact> deps = new Aether(remotes, local).resolve(
new DefaultArtifact("junit", "junit-dep", "", "jar", "4.10"),
"runtime"
);
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以加载settings.xml和获取存储库信息?
我在我的项目中使用缓存机制的@Cacheable注释,com.jcabi.aspects我有一个场景,我需要从缓存中刷新特定数据,而不是刷新整个缓存.这怎么可能?
例如,
import com.jcabi.aspects.Cacheable;
public class Employees {
@Cacheable(lifetime = 1, unit = TimeUnit.HOURS)
static int size(Organization org) {
// calculate their amount in MySQL
}
@Cacheable.FlushBefore
static void add(Employee employee, Organization org) {
// add a new one to MySQL
}
}
Run Code Online (Sandbox Code Playgroud)
如果我有一个由两个组织Org1和Org2使用的Employees类,现在如果将新员工添加到Org1,那么只有Org1的数据应该从缓存中刷新,而Org2的数据应该保留在缓存中.
参考com.jcabi.aspects.Cacheable @Cacheable:http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html