如何等待进程完成Java AWS Lambda
我想等到我的过程结束后再返回我的speechlet响应,否则它似乎会切断我的过程,因此,没有完成它,我实际上相信它可能会冻结过程,但这不是我的愿望 我该如何等待如何等待进程完成Java AWS Lambda,java,amazon-web-services,aws-lambda,Java,Amazon Web Services,Aws Lambda,我想等到我的过程结束后再返回我的speechlet响应,否则它似乎会切断我的过程,因此,没有完成它,我实际上相信它可能会冻结过程,但这不是我的愿望 我该如何等待 @Override public SpeechletResponse onIntent(SpeechletRequestEnvelope<IntentRequest> requestEnvelope) { IntentRequest request = requestEnvelope.getRequest();
@Override
public SpeechletResponse onIntent(SpeechletRequestEnvelope<IntentRequest> requestEnvelope) {
IntentRequest request = requestEnvelope.getRequest();
Intent intent = request.getIntent();
String intentName = (intent != null) ? intent.getName() : null;
if (intentName == null) return null;
switch (intentName) {
case IntentTitle.NEW_TICKET:
switch (request.getDialogState()) {
case STARTED:
return Response.getDialogueResponse(intent, true);
case IN_PROGRESS:
return Response.getDialogueResponse(intent, false);
case COMPLETED:
String numberString = intent.getSlot(SlotTitle.ID).getValue();
if (!NumberUtils.isCreatable(numberString)) return Response.ERROR;
Member member = Info.GUILD.getMemberById(numberString);
User sender = UserDB.getUser(member);
CommissionTicket commissionTicket = new CommissionTicket(sender);
commissionTicket.create();
//wait until processes finish before continuing
return Response.NEW_TICKED_CREATED;
}
}
return null;
}
@覆盖
公共SpeechletResponse-OnContent(SpeechletRequestEnvelope-requestEnvelope){
IntentRequest request=requestEnvelope.getRequest();
Intent=request.getIntent();
字符串intentName=(intent!=null)?intent.getName():null;
if(intentName==null)返回null;
交换机(intentName){
案例意向书。新票:
开关(request.getDialogState()){
案件开始:
返回Response.getDialogueResponse(intent,true);
正在进行的案件:
返回Response.getDialogueResponse(intent,false);
个案完成:
String numberString=intent.getSlot(SlotTitle.ID).getValue();
if(!NumberUtils.iscreated(numberString))返回Response.ERROR;
Member Member=Info.GUILD.getMemberById(numberString);
User sender=UserDB.getUser(成员);
佣金票证佣金票证=新佣金票证(发送方);
commissionTicket.create();
//等待进程完成后再继续
return Response.NEW_TICKED_创建;
}
}
返回null;
}
更新:
看了一下CloudWatch的日志,我所期待的事情正在发生。。。看看这些日志的时间(我运行了3次,所以记录了3次不同的时间,但都是在同一个lambda会话之外)
public void create(){
系统输出打印项次(“log2”);
GuildController GuildController=Info.GUILD.getController();
guildController.createTextChannel(ticketType.name().toLowerCase()+“-”+creator.getName()+“-”+id.value()).queue(通道->{
系统输出打印项次(“log3”);
ChannelManager ChannelManager=channel.getManager();
GuildManager GuildManager=channelManager.getGuild().getManager();
List members=guildManager.getGuild().getMembers();
List admin=new ArrayList();
代表(成员:成员){
for(角色:member.getRoles()){
如果(!role.getName().equalsIgnoreCase(Info.ADMIN_STRING))继续;
添加管理员(成员);
}
}
系统输出打印项次(“log4”);
代表(成员:成员){
如果(member.equals(creator.getMember())继续;
channel.createPermissionOverride(member).setDeny(Permission.MESSAGE_READ).queue();
}
系统输出打印项次(“log5”);
对于(成员管理员:管理员){
如果(admin.equals(creator.getMember())继续;
channel.createPermissionOverride(admin).setAllow(Permission.MESSAGE_READ).queue();
}
系统输出打印项次(“log6”);
BotMessage BotMessage=新的BotMessage();
僵尸消息
.setTitle(“新票证!用户:+creator.getName())
.SetColor(颜色为青色)
.setDescription(“请在此处输入您的完整请求!\n”+
“请确保让我们知道您是否正在寻找报价/时间范围,\n”+
或者考虑预算,我们将与您合作!\n\n+
“销售代表将尽快与您联系!”)
.发送((文本频道)频道);
系统输出打印项次(“log7”);
this.textChannel=(textChannel)通道;
TicketDB.addTicket(本);
系统输出打印项次(“log8”);
}
);
日志:
更新
实现了Future类,工作正常,但仍然有点问题。
它现在完全创建了票据,这很好,但是,当我再次发送相同的呼叫时,出于某种原因,它会在创建下一张票据之前在相同的通道中发送消息
所以,为了模拟
通过AWS Lambda调用函数
完全创建票证
再次通过AWS Lambda调用函数
在前一个tickets频道中发送一两条消息
完全创建新票证
@覆盖
公共SpeechletResponse-OnContent(SpeechletRequestEnvelope-requestEnvelope){
IntentRequest request=requestEnvelope.getRequest();
Intent=request.getIntent();
字符串intentName=(intent!=null)?intent.getName():null;
if(intentName==null)返回null;
交换机(intentName){
案例意向书。新票:
开关(request.getDialogState()){
案件开始:
返回Response.getDialogueResponse(intent,true);
正在进行的案件:
返回Response.getDialogueResponse(intent,false);
个案完成:
String numberString=intent.getSlot(SlotTitle.ID).getValue();
if(!NumberUtils.iscreated(numberString))返回Response.ERROR;
Member Member=Info.GUILD.getMemberById(numberString);
User sender=UserDB.getUser(成员);
系统输出打印项次(“log1”);
Future commissionTicket=新的commissionTicket(发件人).create();
试一试{
获取(10000,时间单位毫秒);
}捕获(例外e){
e、 printStackTrace();
}
public void create() {
System.out.println("log2");
GuildController guildController = Info.GUILD.getController();
guildController.createTextChannel(ticketType.name().toLowerCase() + "-" + creator.getName() + "-" + id.value()).queue(channel -> {
System.out.println("log3");
ChannelManager channelManager = channel.getManager();
GuildManager guildManager = channelManager.getGuild().getManager();
List<Member> members = guildManager.getGuild().getMembers();
List<Member> admins = new ArrayList<>();
for (Member member : members) {
for (Role role : member.getRoles()) {
if (!role.getName().equalsIgnoreCase(Info.ADMIN_STRING)) continue;
admins.add(member);
}
}
System.out.println("log4");
for (Member member : members) {
if (member.equals(creator.getMember())) continue;
channel.createPermissionOverride(member).setDeny(Permission.MESSAGE_READ).queue();
}
System.out.println("log5");
for (Member admin : admins) {
if (admin.equals(creator.getMember())) continue;
channel.createPermissionOverride(admin).setAllow(Permission.MESSAGE_READ).queue();
}
System.out.println("log6");
BotMessage botMessage = new BotMessage();
botMessage
.setTitle("New Ticket! User: " + creator.getName())
.setColour(Color.CYAN)
.setDescription("Please enter your full request here! \n" +
"Make sure to let us know whether you are looking for a quote/timeframe,\n" +
"or have a budget in mind, and we will work around you!\n\n" +
"A sales representative will be with you as soon as possible!")
.send((TextChannel) channel);
System.out.println("log7");
this.textChannel = (TextChannel) channel;
TicketDB.addTicket(this);
System.out.println("log8");
}
);
@Override
public SpeechletResponse onIntent(SpeechletRequestEnvelope<IntentRequest> requestEnvelope) {
IntentRequest request = requestEnvelope.getRequest();
Intent intent = request.getIntent();
String intentName = (intent != null) ? intent.getName() : null;
if (intentName == null) return null;
switch (intentName) {
case IntentTitle.NEW_TICKET:
switch (request.getDialogState()) {
case STARTED:
return Response.getDialogueResponse(intent, true);
case IN_PROGRESS:
return Response.getDialogueResponse(intent, false);
case COMPLETED:
String numberString = intent.getSlot(SlotTitle.ID).getValue();
if (!NumberUtils.isCreatable(numberString)) return Response.ERROR;
Member member = Info.GUILD.getMemberById(numberString);
User sender = UserDB.getUser(member);
System.out.println("log1");
Future<Ticket> commissionTicket = new CommissionTicket(sender).create();
try {
commissionTicket.get(10000, TimeUnit.MILLISECONDS);
} catch (Exception e) {
e.printStackTrace();
}
//wait until processes finish before continuing
return Response.NEW_TICKED_CREATED;
}
}
return null;
}
public Future<Ticket> create() {
System.out.println("log2");
GuildController guildController = Info.GUILD.getController();
RequestFuture<Channel> channelRequestFuture = guildController.createTextChannel(ticketType.name().toLowerCase() + "-" + creator.getName() + "-" + id.value()).submit();
try {
Channel channel = channelRequestFuture.get(10000, TimeUnit.MILLISECONDS);
System.out.println("log3");
ChannelManager channelManager = channel.getManager();
GuildManager guildManager = channelManager.getGuild().getManager();
List<Member> members = guildManager.getGuild().getMembers();
List<Member> admins = new ArrayList<>();
for (Member member : members) {
for (Role role : member.getRoles()) {
if (!role.getName().equalsIgnoreCase(Info.ADMIN_STRING)) continue;
admins.add(member);
}
}
System.out.println("log4");
for (Member member : members) {
if (member.equals(creator.getMember())) continue;
channel.createPermissionOverride(member).setDeny(Permission.MESSAGE_READ).queue();
}
System.out.println("log5");
for (Member admin : admins) {
if (admin.equals(creator.getMember())) continue;
channel.createPermissionOverride(admin).setAllow(Permission.MESSAGE_READ).queue();
}
System.out.println("log6");
BotMessage botMessage = new BotMessage();
botMessage
.setTitle("New Ticket! User: " + creator.getName())
.setColour(Color.CYAN)
.setDescription("Please enter your full request here! \n" +
"Make sure to let us know whether you are looking for a quote/timeframe,\n" +
"or have a budget in mind, and we will work around you!\n\n" +
"A sales representative will be with you as soon as possible!")
.send((TextChannel) channel);
System.out.println("log7");
this.textChannel = (TextChannel) channel;
TicketDB.addTicket(this);
System.out.println("log8");
Future<Ticket> future = ConcurrentUtils.constantFuture(this);
return future;
} catch (Exception e) {
e.printStackTrace();
}
if (!userIsInTicket(creator)) users.add(creator);
return null;
}