我正在将对象数组发送到AWS Lambda函数,以便它可以触发该数组中每个对象的POST请求,但是lambda函数在API网关日志中始终给我一个错误:
由于超时错误,执行失败
30秒后:
正在将请求发送到https://lambda.ap-southeast-1.amazonaws.com/2015-03-31/functions/ ...
我也收到重复的POST请求,因为Lambda每次尝试失败后都会重试5次,并且每次都从阵列上重新开始。
这是lambda函数:
public class MainActivity extends AppCompatActivity {
private String URLline = "https://demonuts.com/Demonuts/JsonTest/Tennis/simplelogin.php";
private EditText etUname, etPass;
private Button btn;
public static String firstName, hobby,myresponse,myresponse2,result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etUname = findViewById(R.id.etusername);
etPass = findViewById(R.id.etpassword);
btn = findViewById(R.id.btn);
final Map<String,String> params2 = new HashMap<String, String>();
params2.put("PARAM1","AAA");
params2.put("PARAM2","ABC");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
result=loginUser(URLline,params2);
Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();
Toast.makeText(MainActivity.this,"Hellooooooo",Toast.LENGTH_LONG).show();
}
});
}
private String loginUser(String URL, final Map params2){
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG).show();
myresponse =response;
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();
}
}
)
{
@Override
protected Map<String,String> getParams(){
Map<String,String> params = new HashMap<String, String>();
params.putAll(params2);
return params;
}
};
stringRequest.setRetryPolicy(new DefaultRetryPolicy(200000, -1, 0));
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
if (myresponse != null)
{
myresponse=myresponse.replaceAll("//r//n","");
myresponse=myresponse.replaceAll("//","");
myresponse=myresponse.substring(1,myresponse.length()-2);
}
return myresponse;
}
}
答案 0 :(得分:0)
您正在达到API网关超时限制(30秒),而不是在Lambda函数上超时。
此30秒的API网关超时是一个硬限制,无法增加。对于长时间运行的进程,请考虑使函数异步,也许使用诸如SQS之类的排队机制。
注意:即使API网关在30秒后超时(返回HTTP调用),也不一定不一定意味着Lambda函数会同时终止。 Lambda函数可能会继续处理超过30秒标记,直至达到其自身的超时限制。
因此,即使在客户端API调用返回错误后,Lambda函数也可以完成其余的POST调用。这可能是您看到许多重复项的另一个原因-每次调用API时,即使出现错误消息,该函数也可能运行完成。
(n.b。,除非该函数是幂等的,通常来说,Lambda函数最好检测是否使用相同的数据多次调用它们,并优雅地处理此类情况以防止重复。)