我有一个Celery任务,我延迟地异步调用它。发生异常时,它会重试自身,并且每次尝试都会增加延迟。
public class Demo {
Set<String> freinds = new HashSet<>();
public static void main(String[] args) {
String[][] emailArray = new String[][] {
{ "abc@gmail.com", "abc1@gmail.com,abc2@gmail.com,abc3@gmail.com,1212@gmail.com" },
{ "abc1@gmail.com", "bcs1@gmail.combc2@gmail.com,bcds3@gmail.com" },
{ "bc@gmail.com", "bc1@gmail.combc2@gmail.com,bc3@gmail.com" } };
new Demo().sendMail("@gmail.combc2@gmail.com", "sdsd", emailArray);
}
void sendMail(String email, String message, String[][] freindsArray) {
Map<String, Email> emailsMap = new HashMap<>();
for (int i = 0; i < freindsArray.length; i++) {
for (int j = 0; j < 1; j++) {
Email e = new Email(freindsArray[i][j]);
e.addConnectedNodes(freindsArray[i][j + 1]);
emailsMap.put(e.email, e);
}
}
if (emailsMap.containsKey(email)) {
Demo.getNodesFollowAllEdges(emailsMap.get(email), emailsMap).forEach(e -> {
System.out.println(e);
});
} else {
System.out.println("no emails exist");
}
}
private static Set<String> getNodesFollowAllEdges(Email e, Map<String, Email> emailsMap) {
Set<String> nodes = getNodesFollowAllEdges(e, new HashSet<>(), emailsMap);
nodes.remove(e.email);
return nodes;
}
private static Set<String> getNodesFollowAllEdges(Email node, Set<String> visited, Map<String, Email> emailsMap) {
if (node.getConnectedEmails().isEmpty()) {
return visited;
}
for (String n : node.getConnectedEmails()) {
if (!visited.contains(n)) {
visited.add(n);
if (emailsMap.get(n) != null) {
getNodesFollowAllEdges(emailsMap.get(n), visited, emailsMap);
}
}
}
return visited;
}
}
class Email {
String email;
List<String> freindsEmails = new ArrayList<>();
public List<String> getConnectedEmails() {
return freindsEmails;
}
public Email(String email) {
this.email = email;
}
public void addConnectedNodes(String friendsEmail) {
freindsEmails.addAll(Arrays.asList(friendsEmail.split(",")));
}
}
这在实践中可以正常工作,但是我正在尝试编写一个单元测试,以检查倒计时是否确实具有正确的值。
我试图做的是模拟cancel_issue_request.retry方法,但是一旦这样做,该方法本身就会中断并且不会重试该任务。 我以为您可以用仍然可以使用spec = celery.task.Task.retry来执行其所有功能的方法来模拟方法,但是我无法使其正常工作,请给我启发?
或者,我想在某个地方阅读Celery进行的重试,但是我无法从Celery中获取该信息。
答案 0 :(得分:0)
在不破坏功能的情况下设法模拟该功能:
cancel_issue_request.retry = Mock(side_effect=cancel_issue_request.retry)