关于与https请求多线程spring的jpa和http请求和线程的关系的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于httpclient中的httppost请求,能去获取链接是http
关于与https请求多线程spring的jpa和http请求和线程的关系的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于httpclient中的httppost请求,能去获取链接是https请求的数据嘛、Http请求和Https请求的区别、java – 编程Spring MVC控制器和用于HttpDelete的jsp、Java 使用代理发送Http请求 (将Http请求代理Https请求)等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- 与https请求多线程spring的jpa(http请求和线程的关系)
- httpclient中的httppost请求,能去获取链接是https请求的数据嘛
- Http请求和Https请求的区别
- java – 编程Spring MVC控制器和用于HttpDelete的jsp
- Java 使用代理发送Http请求 (将Http请求代理Https请求)
与https请求多线程spring的jpa(http请求和线程的关系)
我正在使用spring JPA
和HTTPpost
request,逐行获取数据,然后将数据发布到HTTP请求到API,它对我来说很好用,但是在这里我正在处理大量数据,所以我必须使用多线程但我是java和spring的新手,我如何实现与10个线程一起使用的功能,每个线程每次并行读取1k呢?
我已经阅读了有关10个线程的多线程的知识,每个线程每次读取1k行,我的数据库中大约有1000万条记录
AccessingDataJpaApplication类:
@SpringBootApplicationpublic class AccessingDataJpaApplication implements CommandLineRunner { private static final Logger logger = LoggerFactory.getLogger(AccessingDataJpaApplication.class); @Autowired private Bulk_repositoryRepository bulk_repositoryRepository; public static void main(String[] args) { SpringApplication.run(AccessingDataJpaApplication.class); } Date currentDate = new Date(); @Override public void run(String... args) throws Exception { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); headers.setBasicAuth("user", "pass"); while(true) { Date currentDate = new Date(); logger.info("Just Started"); for (Bulk_repository churnss : bulk_repositoryRepository.findAllByStatusAndCampTypeAndCampStartDateLessThanEqualAndCampEndDateGreaterThanEqual(0,2,currentDate,currentDate)) { System.out.print(churnss); logger.info(churnss.toString()); AddOfferRequest AddOffer = new AddOfferRequest("113", churnss.getMsisdn(),churnss.getParam1()); logger.info(AddOffer.toString()); HttpEntity<AddOfferRequest> entity = new HttpEntity<AddOfferRequest>(AddOffer,headers); ResponseEntity<String> responseEntity = restTemplate.exchange( "api link", HttpMethod.POST, entity, String.class); if(responseEntity.getStatusCode() == HttpStatus.OK){ String response = responseEntity.getBody(); churnss.setStatus(1); churnss.setProcessDate(new Date()); churnss.setFulfilment_status(response); logger.info(churnss.toString() + ", Response: " + response); bulk_repositoryRepository.save(churnss); }else { logger.warn("Record Id: " + churnss.getId() + ", Http Failed Response: " + responseEntity.getStatusCode()); } } Thread.sleep(1000); } }}
Bulk_repository类:
@Entity@Table(name = "BULK_REPOSITORY")public class Bulk_repository { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name = "id") private long id; @Column(name = "msisdn") private String msisdn; @Column(name = "camp_start_date") private Date campStartDate; @Column(name = "camp_end_date") private Date campEndDate; @Column(name = "camp_type") private int campType; @Column(name = "camp_cd") private String camp_cd; @Column(name = "status") private int status; @Column(name = "process_date") private Date processDate; @Column(name = "entry_date") private Date entryDate; @Column(name = "entry_user") private String entry_user; @Column(name = "param1") private String param1; @Column(name = "param2") private String param2; @Column(name = "param3") private String param3; @Column(name = "param4") private String param4; @Column(name = "param5") private String param5; @Column(name = "error_desc") private String error_desc; @Column(name = "fulfilment_status") private int fulfilment_status; ##then getter and setters and tostring
Bulk_repositoryRepository类:
public interface Bulk_repositoryRepository extends CrudRepository<Bulk_repository, Long> { Date today = new Date(); List<Bulk_repository>findAllByStatusAndCampTypeAndCampStartDateLessThanEqualAndCampEndDateGreaterThanEqual(int status, int campType,Date today0, Date today1); Bulk_repository findById(long id);}
AddOfferRequest类:
public class AddOfferRequest { private String ChannelID="113"; private String MSISDN; private String ServiceID; public AddOfferRequest() { } public AddOfferRequest(String channelID,String mSISDN,String serviceID ) { this.MSISDN = mSISDN; this.ServiceID = serviceID; } ## then getter and setter and tostring
我创建了AsyncConfiguration类:
package com.example.accessingdatajpa;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration@EnableAsyncpublic class AsyncConfiguration { private static final Logger LOGGER = LoggerFactory.getLogger(AsyncConfiguration.class); @Bean (name = "taskExecutor") public Executor taskExecutor() { LOGGER.debug("Creating Async Task Executor"); final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(2); executor.setMaxPoolSize(2); executor.setQueueCapacity(1000); executor.setThreadNamePrefix("CarThread-"); executor.initialize(); return executor; }}
但是直到现在我还是不明白如何将findby和http post与多线程结合起来
答案1
小编典典重写您的代码。而不是List<Bulk_repository>
返回Stream<Bulk_repository>
。这将懒惰地从数据库中加载记录,而不是尝试立即执行所有操作。
然后使用TaskExecutor
来为每个线程执行不同的请求,只给它一个任务,它将在有空闲线程时执行。
@SpringBootApplicationpublic class AccessingDataJpaApplication implements CommandLineRunner { private static final Logger logger = LoggerFactory.getLogger(AccessingDataJpaApplication.class); @Autowired private Bulk_repositoryRepository bulk_repositoryRepository; @Autowired private AsyncTaskExecutor executor; @Autowired private RestTemplate rest; public static void main(String[] args) { SpringApplication.run(AccessingDataJpaApplication.class); } @Override public void run(String... args) throws Exception { Date currentDate = new Date(); Stream< Bulk_repository> results = Bulk_repository churnss : bulk_repositoryRepository.findAllByStatusAndCampTypeAndCampStartDateLessThanEqualAndCampEndDateGreaterThanEqual(0,2,currentDate,currentDate); results.forEach(it -> executor.submit(this.process(it))); Thread.sleep(1000); } private void process(RestTemplate rest, Bulk_repository churnss) { AddOfferRequest AddOffer = new AddOfferRequest("113", churnss.getMsisdn(),churnss.getParam1()); HttpEntity<AddOfferRequest> entity = new HttpEntity<AddOfferRequest>(AddOffer,headers); try { ResponseEntity<String> responseEntity = restTemplate.exchange( "api link", HttpMethod.POST, entity, String.class); if(responseEntity.getStatusCode() == HttpStatus.OK){ String response = responseEntity.getBody(); churnss.setStatus(1); churnss.setProcessDate(new Date()); churnss.setFulfilment_status(response); bulk_repositoryRepository.save(churnss); }else { logger.warn("Record Id: {}, Http Failed Response: {}",churnss.getId(), responseEntity.getStatusCode()); } } catch (RestClientException rce) { logger.warn("Record Id: {} Http Failed. ", churnss.getId(), rce); } }}
注意: 这是从我的头顶输入的,未经测试。但是应该提供一些指导。
httpclient中的httppost请求,能去获取链接是https请求的数据嘛
能和https一样请求到数据嘛Http请求和Https请求的区别
HTTP(Hypertext Transfer Protocol Vertion )超文本传输协议,被用于在web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截获了传输报文,就可以读取内容,所以不建议传输一些敏感信息。
为了解决这一缺陷,需要使用另一种协议,安全套接字超文本传输协议(HTTPS),为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL 协议,SSL依靠证书来检验服务器的身份,并且还为客户端与服务器之间的通信加密。
每次开网页时为什么要出现“http://”呢? 其实这个道理非常简单,因为你要获得网络上超文本信息,那么你肯定要遵循其超文本传输的规范。
基本概念:
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
HTTP与HTTPS的区别:
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
客户端在使用HTTPS方式与web服务器通信时有以下几个步骤:
(1)客户端使用HTTPS的URL访问web服务器,要求与web服务器建立SSL连接
(2)web服务器收到客户端请求后,会将网站的证书信息(包含公钥)传送给客户端
(3)客户端与服务器之开始协商SSL连接的安全等级,也就是信息加密的等级
(4)客户端根据双方同意的安全等级,建立会话密钥,然后利用公钥对会话密钥加密,并传送给服务器
(5)服务器利用自己的私钥解密出会话密钥
(6)服务器利用会话密钥与客户端进行通信
HTTPS的优缺点:
优点:是加密传输、身份认证的网络协议,比HTTP安全,防止数据在传输过程中被窃取、改变,确保完整性。增加攻击成本。
缺点:不是绝对安全,加密范围有限、握手阶段比较费时、增加耗电、不如HTTP高效、需要花钱、通常需要绑定ip
HTTPS解决的问题:
1 . 信任主机的问题. 采用https 的server 必须从CA 申请一个用于证明服务器用途类型的证书(CA证书:这里的证书类似于解密的一个签名). 改证书只有用于对应的server 的时候,客户度才信任次主机。所以目前所有的银行系统网站,关键部分应用都是https 的,客户通过信任该证书,从而信任了该主机,其实这样做效率很低,但是银行更侧重安全。这一点对我们没有任何意义,我们的server 采用的证书不管自己issue 还是从公众的地方issue,客户端都是自己人,所以我们也就肯定信任该server。
2 . 通讯过程中的数据的泄密和被窜改
1)一般意义上的https, 就是 server 有一个证书.
a) 主要目的是保证server 就是他声称的server. 这个跟第一点一样.
b) 服务端和客户端之间的所有通讯,都是加密的.
i. 具体讲,是客户端产生一个对称的密钥,通过server 的证书来交换密钥,一般意义上的握手过程。
ii. 加下来所有的信息往来就都是加密的,第三方即使截获,也没有任何意义,因为他没有密钥,当然窜改也就没有什么意义了。
2)少许对客户端有要求的情况下,会要求客户端也必须有一个证书。
a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码, 还有一个CA 认证过的身份,个人证书一般来说上别人无法模拟的,所有这样能够更深的确认自己的身份。
b) 目前少数个人银行的专业版是这种做法,具体证书可能是拿U盘作为一个备份的载体。
密钥交换算法:
使用对称加密算法时,密钥交换是个大难题,所以Diffie和Hellman提出了著名的Diffie-Hellman密钥交换算法。
Diffie-Hellman密钥交换算法原理:
1 (1)Alice与Bob确定两个大素数n和g,这两个数不用保密
2
3 (2)Alice选择另一个大随机数x,并计算A如下:A=g^x mod n
4
5 (3)Alice将A发给Bob
6
7 (4)Bob 选择另一个大随机数y,并计算B如下:B=g^y mod n
8
9 (5)Bob将B发给Alice
10
11 (6)计算秘密密钥K1如下:K1=B^x mod n
12
13 (7)计算秘密密钥K2如下:K2=A^y mod n
14
15 K1=K2,因此Alice和Bob可以用其进行加解密
java – 编程Spring MVC控制器和用于HttpDelete的jsp
这是打算这样做的JSP代码:
<td><form:form method="DELETE" action="/client/invoices/${invoice.id}"><input type="submit" value="delete"></form:form></td>
生成的html是这样的:
<td><form id="command" action="/client/invoices/9" method="post"><input type="hidden" name="_method" value="DELETE"/><input type="submit" value="delete"></form></td>
所以,我很高兴.它有_method表示它是DELETE操作.这是我的控制器代码:
@RequestMapping(value = "/{id}",method = RequestMethod.DELETE) public String delete(@PathVariable("id") Long id,@RequestParam(value = "page",required = false) Integer page,@RequestParam(value = "size",required = false) Integer size,Model uiModel) { invoiceServiceHibernate.removeInvoice(id); return "redirect:/invoices"; }
那么,会发生什么是没有调用此方法.我有另一种方法,它执行POST来创建发票并单击删除按钮而不是创建发票.我的猜测是控制器将servlet视为POST请求,并使用第一个处理POST请求的方法,在这种情况下创建新发票.
我尝试使这个“RESTful”所以我希望这是/ invoice / id并使用POST,PUT,DELETE,GET但我不知道如何使用Spring MVC在控制器中编写代码.
我可以通过附加/ veroices / id / delete等“动词”并将控制器设置为
@RequestMapping(value = "/{id}/delete",method = RequestMethod.POST)
请注意,RequestMethod.POST但由于映射值显式具有/ id / delete,因此它不使用映射到/ invoices和/ invoices / id的默认POST.
我希望我很清楚.如果有人有任何建议或示例代码(强烈优先),我将不胜感激.我已阅读这些SO链接以供参考:
Link1
Link2
Link3
解决方法
<filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <servlet-name>servletName</servlet-name> </filter-mapping>
Java 使用代理发送Http请求 (将Http请求代理Https请求)
package com.test.porxy;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.Proxy.Type;
public class HttpAndHttpsProxy {
/**
* url:外网测试地址 param:请求报文 proxy:代理地址(内网IP地址:10.0.100.00) port :端口号(22)
* **/
public static String HttpProxy(String url, String param, String proxy,
int port) {
HttpURLConnection httpConn = null;
PrintWriter out = null;
OutputStreamWriter out1 = null;
BufferedReader in = null;
String result = "";
BufferedReader reader = null;
try {
URL urlClient = new URL(url);
System.out.println("请求的URL========:" + urlClient);
// 创建代理
Proxy proxy1 = new Proxy(Type.HTTP, new InetSocketAddress(proxy,
port));
// 设置代理
httpConn = (HttpURLConnection) urlClient.openConnection(proxy1);
// 设置通用的请求属性
httpConn.setRequestProperty("accept", "*/*");
httpConn.setRequestProperty("connection", "Keep-Alive");
httpConn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
// 获取URLConnection对象对应的输出流
//使请求报文不中文乱码
out1 = new OutputStreamWriter(httpConn.getOutputStream(), "utf-8");
out1.write(param);
// 发送请求参数
// out.print(param);
// flush输出流的缓冲
out1.flush();
// 定义BufferedReader输入流来读取URL的响应
// in = new BufferedReader(
// new InputStreamReader(httpConn.getInputStream()));
//使返回的报文不中文乱码
in = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "utf-8"));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
// 断开连接
httpConn.disconnect();
System.out.println("====result====" + result);
System.out.println("返回结果:" + httpConn.getResponseMessage());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (out1 != null) {
out1.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
public static void main(String[] args) {
// 示例
HttpProxy("请求地址", "请求参数", "代理地址", 0);
}
}
关于与https请求多线程spring的jpa和http请求和线程的关系的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于httpclient中的httppost请求,能去获取链接是https请求的数据嘛、Http请求和Https请求的区别、java – 编程Spring MVC控制器和用于HttpDelete的jsp、Java 使用代理发送Http请求 (将Http请求代理Https请求)的相关知识,请在本站寻找。
本文标签: