GVKun编程网logo

与https请求多线程spring的jpa(http请求和线程的关系)

4

关于与https请求多线程spring的jpa和http请求和线程的关系的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于httpclient中的httppost请求,能去获取链接是http

关于与https请求多线程spring的jpahttp请求和线程的关系的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于httpclient中的httppost请求,能去获取链接是https请求的数据嘛、Http请求和Https请求的区别、java – 编程Spring MVC控制器和用于HttpDelete的jsp、Java 使用代理发送Http请求 (将Http请求代理Https请求)等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

与https请求多线程spring的jpa(http请求和线程的关系)

与https请求多线程spring的jpa(http请求和线程的关系)

我正在使用spring JPAHTTPpostrequest,逐行获取数据,然后将数据发布到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请求的数据嘛

httpclient中的httppost请求,能去获取链接是https请求的数据嘛

能和https一样请求到数据嘛

Http请求和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

java – 编程Spring MVC控制器和用于HttpDelete的jsp

我试图通过删除链接(一个href)或删除按钮(窗体)删除页面上的实体.我正在使用删除按钮,因为链接要求“GET”而不是“POST”

这是打算这样做的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

解决方法

你在web.xml中设置了 HiddenHttpMethodFilter吗?该过滤器将发布的方法参数转换为HTTP方法,并允许在Spring MVC表单标记中支持方法转换.
<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请求)

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的jpahttp请求和线程的关系的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于httpclient中的httppost请求,能去获取链接是https请求的数据嘛、Http请求和Https请求的区别、java – 编程Spring MVC控制器和用于HttpDelete的jsp、Java 使用代理发送Http请求 (将Http请求代理Https请求)的相关知识,请在本站寻找。

本文标签: