「java异步推送」java中异步
本篇文章给大家谈谈java异步推送,以及java中异步对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
java怎么同步发送及异步发送短信例子解析
发送短信的接口
根据自己的情况选择服务商。
开发文档
从开发文档中我们可以看到. 可以直接使用http请求也可以使用WebService请求发送短信. 由于DEMO文件夹下的java和jsp文件夹中的代码都是使用http请求发送短信. 所以这里就不再细说了, 我们使用WebService的方式演示发送短信.
生成客户端代码
从接口文档中我们知道它的WebService的WSDL的url为: 那么我们可以执行下面的命令生成客户端代码:
wsimport -keep
其中wsimport是JDK自带的工具, -keep url选项是"保留生成的文件". 该命令会在当前目录下生成sms.cn.ihuyi._106包, 以及众多的类. 接下来开始编写我们自己的代码.
定义接口
为了方便, 这里我们首先定义一个接口:
Sms.java
public interface Sms {
/**
* 向mobile发送短信, 内容为message
*
* @param mobile 手机号
* @param message 短信内容
* @return 成功返回-1, 否则返回其他值
*/
int sendMessage(String mobile, String message);
}
这个接口很简单, 只有一个方法. 这个方法用来发送短信.
同步发送短信
接下来我们首先实现一个同步发送短信的类:
IhuyiSmsImpl.java
public class IhuyiSmsImpl implements Sms {
private String account;
private String password;
public void setAccount(String account) {
this.account = account;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public int sendMessage(String mobile, String message) {
cn.ihuyi._106.Sms factory = new cn.ihuyi._106.Sms();
SmsSoap smsSoap = factory.getSmsSoap();
SubmitResult submit = smsSoap.submit(account, password, mobile, message);
int code = submit.getCode();
if(code == 2){
return -1;
}
System.out.println("发送短信失败, code:" + code);
return code;
}
}
异步发送短信
由于发送短信涉及到网络通信, 因此sendMessage方法可能会有一些延迟. 为了改善用户体验, 我们可以使用异步发送短信的方法. 原理很简单: 如果用户请求发送短信, 我们不是直接调用IhuyiSmsImpl的sendMessage方法, 而是将请求保存起来(生产者), 然后告诉用户: 短信发送成功. 之后有若干个消费者取出任务, 调用sendMessage方法发送短信.
这里, 我使用线程池完成上面的任务:
AsyncSmsImpl.java
public class AsyncSmsImpl implements Sms {
public Sms sendSms;
private ExecutorService executorService = Executors.newFixedThreadPool(3);
public void setSendSms(Sms sendSms) {
this.sendSms = sendSms;
}
@Override
public int sendMessage(String mobile, String message) {
try {
executorService.submit(() - sendSms.sendMessage(mobile, message));
}
catch(Exception e) {
Sysemt.out.println("提交任务时发生错误" + e);
return 0;
}
return -1;
}
public void destroy(){
try{
executorService.shutdown();
}
catch(Exception e){}
}
}
在第17行, 我们获得远程对象的一个代理对象. 之后就可以通过这个代理对象进行发送短信, 查询账户余额等操作.
第18行, 使用该代理对象的submit方法提交了短信内容. 该方法的参数信息及返回值含义在接口文档中有详细的说明.
第19行我们获得了结果的状态码. 根据文档上的说明, 状态码为2说明提交成功. 简单起见, 这里我们只关注提交成功的情况. 需要注意的是, 状态码为2只是说明提交成功. 根据官网上的"3-5秒内响应、100%到达", 我们可以推测. 如果提交成功, 那么基本上3-5秒内,短信就会发送成功, 根据用户的网络情况, 可能稍有延迟用户就可以收到短信.
使用这段代码发送短信也很简单, 直接new一个对象, 设置好账号和密码就可以发送短信了.
代码很简单, 直接将Sms接口的sendMessage(mobile, message)方法作为一个任务加到线程池的任务队列中. 这样等到有空闲线程时, 就会执行sendSms.sendMessage(mobile, message)发送短信. 这里我们假设只要保存到线程池就可以成功发送短信. 因为发送失败的情况实际上很罕见.
关于java推送数据程序
每个更新做成一个包,每个包设定一个编号。
推送前,确定下游的编号(双方约定一个调用即可),然后将编号以后的推送过去。
java 异步发送短信,异步怎么实现
java 异步发送短信,异步实现:
1,使用spring框架的异步注解 @Async ,底层应该是一个线程。
2,简单粗暴的方式:开一个线程
new Thread(new Runnable() {
public void run() {
//发送短信
}
}).start();
当然也可以高级一点,使用线程池。
3,更高端一点:使用消息队列MQ
java队列实现异步执行
在整个思路上要调整一下
1、会有很多线程给一个队列上添加任务
2、有一个或者多个线程逐个执行队列的任务
考虑一下几点:
1、没有任务时,队列执行线程处于等待状态
2、添加任务时,激活队列执行线程,全部run起来,首先抢到任务的执行,其他全部wait
给个小例子吧
package org;
import java.util.LinkedList;
import java.util.List;
public class Queues {
public static ListTask queue = new LinkedListTask();
/**
* 假如 参数o 为任务
* @param o
*/
public static void add (Task t){
synchronized (Queues.queue) {
Queues.queue.add(t); //添加任务
Queues.queue.notifyAll();//激活该队列对应的执行线程,全部Run起来
}
}
static class Task{
public void test(){
System.out.println("我被执行了");
}
}
}
package org;
import java.util.List;
public class Exec implements Runnable{
@Override
public void run() {
while(true){
synchronized (Queues.queue) {
while(Queues.queue.isEmpty()){ //
try {
Queues.queue.wait(); //队列为空时,使线程处于等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("wait...");
}
Queues.Task t= Queues.queue.remove(0); //得到第一个
t.test(); //执行该任务
System.out.println("end");
}
}
}
public static void main(String[] args) {
Exec e = new Exec();
for (int i = 0; i 2; i++) {
new Thread(e).start(); //开始执行时,队列为空,处于等待状态
}
//上面开启两个线程执行队列中的任务,那就是先到先得了
//添加一个任务测试
Queues.Task t =new Queues.Task();
Queues.add(t); //执行该方法,激活所有对应队列,那两个线程就会开始执行啦
}
}
上面的就是很简单的例子了
关于java异步推送和java中异步的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-28,除非注明,否则均为
原创文章,转载请注明出处。