㈠ java怎么同步发送及异步发送短信例子解析
发送短信的接口
根据自己的情况选择服务商。
开发文档
从开发文档中我们可以看到. 可以直接使用http请求也可以使用WebService请求发送短信. 由于DEMO文件夹下的java和jsp文件夹中的代码都是使用http请求发送短信. 所以这里就不再细说了, 我们使用WebService的方式演示发送短信.
生成客户端代码
从接口文档中我们知道它的WebService的WSDL的url为:http://106.ihuyi.cn/webservice/sms.php?WSDL那么我们可以执行下面的命令生成客户端代码:
wsimport -keep http://106.ihuyi.cn/webservice/sms.php?WSDL
其中wsimport是JDK自带的工具, -keep url选项是"保留生成的文件". 该命令会在当前目录下生成sms.cn.ihuyi._106包, 以及众多的类. 接下来开始编写我们自己的代码.
定义接口
为了方便, 这里我们首先定义一个接口:
Sms.java
publicinterfaceSms{
/**
*向mobile发送短信,内容为message
*
*@parammobile手机号
*@parammessage短信内容
*@return成功返回-1,否则返回其他值
*/
intsendMessage(Stringmobile,Stringmessage);
}
这个接口很简单, 只有一个方法. 这个方法用来发送短信.
同步发送短信
接下来我们首先实现一个同步发送短信的类:
IhuyiSmsImpl.java
{
privateStringaccount;
privateStringpassword;
publicvoidsetAccount(Stringaccount){
this.account=account;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
@Override
publicintsendMessage(Stringmobile,Stringmessage){
cn.ihuyi._106.Smsfactory=newcn.ihuyi._106.Sms();
SmsSoapsmsSoap=factory.getSmsSoap();
SubmitResultsubmit=smsSoap.submit(account,password,mobile,message);
intcode=submit.getCode();
if(code==2){
return-1;
}
System.out.println("发送短信失败,code:"+code);
returncode;
}
}
异步发送短信
由于发送短信涉及到网络通信, 因此sendMessage方法可能会有一些延迟. 为了改善用户体验, 我们可以使用异步发送短信的方法. 原理很简单: 如果用户请求发送短信, 我们不是直接调用IhuyiSmsImpl的sendMessage方法, 而是将请求保存起来(生产者), 然后告诉用户: 短信发送成功. 之后有若干个消费者取出任务, 调用sendMessage方法发送短信.
这里, 我使用线程池完成上面的任务:
AsyncSmsImpl.java
{
publicSmssendSms;
=Executors.newFixedThreadPool(3);
publicvoidsetSendSms(SmssendSms){
this.sendSms=sendSms;
}
@Override
publicintsendMessage(Stringmobile,Stringmessage){
try{
executorService.submit(()->sendSms.sendMessage(mobile,message));
}
catch(Exceptione){
Sysemt.out.println("提交任务时发生错误"+e);
return0;
}
return-1;
}
publicvoiddestroy(){
try{
executorService.shutdown();
}
catch(Exceptione){}
}
}
在第17行, 我们获得远程对象的一个代理对象. 之后就可以通过这个代理对象进行发送短信, 查询账户余额等操作.
第18行, 使用该代理对象的submit方法提交了短信内容. 该方法的参数信息及返回值含义在接口文档中有详细的说明.
第19行我们获得了结果的状态码. 根据文档上的说明, 状态码为2说明提交成功. 简单起见, 这里我们只关注提交成功的情况. 需要注意的是, 状态码为2只是说明提交成功. 根据官网上的"3-5秒内响应、100%到达", 我们可以推测. 如果提交成功, 那么基本上3-5秒内,短信就会发送成功, 根据用户的网络情况, 可能稍有延迟用户就可以收到短信.
使用这段代码发送短信也很简单, 直接new一个对象, 设置好账号和密码就可以发送短信了.
代码很简单, 直接将Sms接口的sendMessage(mobile, message)方法作为一个任务加到线程池的任务队列中. 这样等到有空闲线程时, 就会执行sendSms.sendMessage(mobile, message)发送短信. 这里我们假设只要保存到线程池就可以成功发送短信. 因为发送失败的情况实际上很罕见.
㈡ 用在异步任务中用HttpUrlConnection获取json的时候 运行到.connect();就崩溃 求解决
android5.0以后主线程不允许获取网络数据,防止卡顿
㈢ java 原生的httpclient 能支持异步吗
什么版本的java
。。。。。。。。。。
~~~~~~~~~~~~~~
㈣ java springMVC中前端一个发出http请求,请求中有A、B两个操作,B操作比较耗时。
如果A操作和B操作之间没有必然的关系的话,可以对B操作另起一个线程去执行,但是如果两个操作之间存在因果关系的话只能等待
㈤ 你的这个“JAVA多线程处理http请求”怎么处理的我现在也遇到了,能可点思路或dome吗
你的意思是得到很多txt文件后,多线程解析吗?
可以实现,将txt文件编号。
多线程解析后得到想要的(部分数据)。
将(部分数据)根据编号进行组合得到最终数据。
(小难点:如果确认所有的线程都已经执行完毕,再进行数据的组合)
高级点的,在组合时发现某个编号的数据不存在,可以重新解析,如果解析不成功,可以返回错误数据,指明是哪个txt文件的哪儿有问题。
㈥ java多线程,调用http接口报错,java.net.ConnectException: Connection refused: connect
能成功首先排除防火墙或端口开发问题;
其次确定你连接的端口是否有最大连接数限制(类似mysql有最大连接线程数);
还有就是对应服务的拒绝策略是啥,默认丢弃
㈦ java关于异步请求http接口
异步请求,那就是开启一条线程来发个http请求
等这条线程得到数据后,再通知主线程
android上的话,就有一个异步任务AnsyTask就是用来处理异步任务了
㈧ 在java中是否可以通过javax.servlet.http.HttpServletRequest对象判断请求是否是异步请求啊
推荐你在异步提交时,多提交一个参数isAJAX=true;
然后,在过滤器中判断这个参数来决定过不过滤。
㈨ 如何使用java多线程处理http请求,求思路
1、先说长连接吧,如果TCP协议的话长连接可以通过心跳包来实现。 2、推送的话,这个可以弄一个定时器,来控制线程,推送发送完毕,线程stop()。
㈩ java httpclient 并发量大怎么办
java httpclient 并发量大解决办法:
首先你要增加一个关于异步IO需要的包:
1、async-http-client包,可以在这里下载:https://oss.sonatype.org/content/repositories/releases/com/ning/async-http-client/1.6.2/
2、log4j的包,这个不用我说了,都知道在哪里
3、slf4j-spi 的包,目前用1.5以上的版本比较多。
4、slf4j-log4j 的包,可以看出,slf4j是在log4j基础上包装的。
OK,就这几个了,弄好后再看看下面这段代码,通过使用它,性能可以得到明显改善:
[java] view plain
AsyncHttpClient client = new AsyncHttpClient();
try {
Future<Response> f = client.prepareGet("http://www.google.com.hk/").execute();
System.out.println(f.get().getResponseBody("Big5"));//谷歌的输出编码集为Big5,反向解析结果的时候使用
}catch(...) {....}
这段代码是不是超级简单,可以通过上面描述的三种方式:
1、直接调用
2、将GetMethod或PostMethod对象作为共享对象反复使用。
3、使用AsyncHttpClient
这三种方法,非别使用一次调用、循环多次调用、并发调用来测试性能,后面两者的性能比第一种方法的性能要高很多。