『壹』 java做一個定時器,兩台伺服器,同一個時間執行,但我只要執行一次,要怎樣做
網頁鏈接遇到過,自己寫了具體實施個方案
『貳』 java做一個定時器,兩台伺服器,為什麼只有一台執行
我覺得你去排查日誌會更有幫助點
1,定時任務設置本身有問題嗎
2,部署2個應用會不會任務本身沖突,比如資源競爭導致一個掛了
3,看一下定時器執行邏輯,什麼情況會導致執行不了,找一下日誌,確認問題在哪
『叄』 集群環境中的定時器怎麼處理
要看定時器具體執行的事務是什麼.
1.給定時任務額外設置一個是否執行的判斷標記.在布署程序中只對其中一個布署的執行判斷標記設置為執行.
2.取消布署服務中的定時任務.單獨編寫一個定時任務加入布署步驟中.
『肆』 java集群下定時任務,怎麼保證任務只執行一次啊
用redis分布式鎖就可以搞定,因為redis對於集群是共享的
『伍』 Java多組定時器實現求助
import java.util.*;
class MyTime
{
int hour; int minute;
MyTime(int hour,int minute){
this.hour=hour;
this.minute=minute;
}
}
public class AboutTime
{
public static void main(String args[]){
final MyTime mt=new MyTime(11,24);
//這里,假設程序運行時,是在早上8點半之前的。其他情況,你自行分析
Calendar cal=Calendar.getInstance();
//此方法獲得當前地域的時間,注意,getInstance是靜態方法
cal.set(cal.HOUR, mt.hour);//設置你所要等待的時刻
cal.set(cal.MINUTE, mt.minute);
Calendar cal2=Calendar.getInstance();//
long time1=cal.get(cal.HOUR_OF_DAY)*3600+cal.get(cal.MINUTE)*60;//將兩個時刻都轉換成秒數,以便進行相減
long time2=cal2.get(cal2.HOUR_OF_DAY)*3600+cal2.get(cal2.MINUTE)*60+cal2.get(cal2.SECOND);
final long waitTime=time1-time2;//此時獲得當前時刻與要等待時刻的時間差,單位是秒
//這里說明一下,現在所指的當前時刻是「Calendar cal2=Calendar.getInstance()」這句執行時所獲得的時刻
//獲得後,它的各值(秒,分,時)等信息都不會改變。當然,運行幾行代碼,花不了幾毫秒。所以
//雖然之前的cal2的時間信息與運行三行代碼以後的時間信息是差不多的
System.out.println(waitTime);//此行用於測試
new Thread(new Runnable(){
public void run(){
try{
for(long l=0;l<waitTime;l++){
Thread.sleep(1000);
System.out.println("###");//一秒打一個,當然,告訴你正在計時
//這里用多線程,因為運行後,可以繼續運行主線程。不影響你干其他事兒。
}
}
catch(InterruptedException e){}
System.out.println(mt.hour+":"+mt.minute+"到了");
}
}).start();
//不過,你說一天要三次計算。這很容易,如何實現,由你自己決定。
}
}
『陸』 資料庫集群,怎麼解決spring定時器的重復問題
有兩種流行Spring定時器配置:Java的Timer類和OpenSymphony的Quartz。
1.Java Timer定時
首先繼承java.util.TimerTask類實現run方法
import java.util.TimerTask;
public class EmailReportTask extends TimerTask{
@Override
public void run() {
...
}
}
在Spring定義
...
配置Spring定時器
<bean id="scheleReportTask" class="org.springframework.scheling.timer.ScheledTimerTask">
<property name="timerTask" ref="reportTimerTask" />
<property name="period">
<value>86400000value>
property>
bean>
timerTask屬性告訴ScheledTimerTask運行哪個。86400000代表24個小時
啟動Spring定時器
Spring的TimerFactoryBean負責啟動定時任務
<bean class="org.springframework.scheling.timer.TimerFactoryBean">
<property name="scheledTimerTasks">
<list><ref bean="scheleReportTask"/>list>
property>
bean>
scheledTimerTasks里顯示一個需要啟動的定時器任務的列表。
可以通過設置delay屬性延遲啟動
<bean id="scheleReportTask" class="org.springframework.scheling.timer.ScheledTimerTask">
<property name="timerTask" ref="reportTimerTask" />
<property name="period">
<value>86400000value>
property>
<property name="delay">
<value>3600000value>
property>
bean>
這個任務我們只能規定每隔24小時運行一次,無法精確到某時啟動
2.Quartz定時器
首先繼承QuartzJobBean類實現executeInternal方法
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheling.quartz.QuartzJobBean;
public class EmailReportJob extends QuartzJobBean{
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
...
}
}
在Spring中定義
<bean id="reportJob" class="org.springframework.scheling.quartz.JobDetailBean">
<property name="jobClass">
<value>EmailReportJobvalue>
property>
<property name="jobDataAsMap">
<map>
<entry key="courseService">
<ref bean="courseService"/>
entry>
map>
property>
bean>
在這里我們並沒有直接聲明一個EmailReportJob Bean,而是聲明了一個JobDetailBean。這個是Quartz的特點。JobDetailBean是Quartz的org.quartz.JobDetail的子類,它要求通過jobClass屬性來設置一個Job對象。
使用Quartz的JobDetail中的另一個特別之處是EmailReportJob的courseService屬性是間接設置的。JobDetail的jobDataAsMap屬性接受一個Map,包括設置給jobClass的各種屬性,當。JobDetailBean實例化時,它會將courseService Bean注入到EmailReportJob 的courseService 屬性中。
啟動定時器
Quartz的org.quartz.Trigger類描述了何時及以怎樣的頻度運行一個Quartz工作。Spring提供了兩個觸發器SimpleTriggerBean和CronTriggerBean。
SimpleTriggerBean與scheledTimerTasks類似。指定工作的執行頻度,模仿scheledTimerTasks配置 .
<bean id="simpleReportTrigger" class="org.springframework.scheling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="reprotJob" />
<property name="startDelay">
<value>360000value>
property>
<property name="repeatInterval">
<value>86400000value>
property>
bean>
startDelay也是延遲1個小時啟動
CronTriggerBean指定工作的准確運行時間
<bean id="cronReportTrigger" class="org.springframework.scheling.quartz.CronTriggerBean">
<property name="jobDetail" ref="reprotJob" />
<property name="cronExpression">
<value>0 0 6 * * ?value>
property>
bean>
屬性cronExpression告訴何時觸發。最神秘就是cron表達式:
Linux系統的計劃任務通常有cron來承擔。一個cron表達式有至少6個(也可能7個)有空格分隔的時間元素。從左到右:
1.秒2.分3.小時4.月份中的日期(1-31)5.月份(1-12或JAN-DEC)6.星期中的日期(1-7或SUN-SAT)7.年份(1970-2099)
每個元素都顯示的規定一個值(如6),一個區間(9-12),一個列表(9,11,13)或一個通配符(*)。因為4和6這兩個元素是互斥的,因此應該通過設置一個問號(?)來表明不想設置的那個欄位,「/」如果值組合就表示重復次數(10/6表示每10秒重復6次)。
啟動定時器
<bean class="org.springframework.scheling.quartz.SchelerFactoryBean">
<property name="triggers">
<list><ref bean="cronReportTrigger"/>list>
property>
bean>
triggers屬性接受一組觸發器。
『柒』 java 集群
一個集群系統是一群鬆散結合的伺服器組,形成一個虛擬的伺服器,為客戶端回用戶提供統一答的服務。對於這個客戶端來說,通常在訪問集群系統時不會意識到它的服務是由具體的哪一台伺服器提供。
集群的目的,是為實現負載均衡(Load Balancing)、容錯(Fault Tolerance)和災難恢復(Failover)。以達到系統可用性(High Availability)和可伸縮性(Scalability)的要求。
集群系統一般應具高可用性、可伸縮性、負載均衡、故障恢復和可維護性等特殊性能。
『捌』 在Java中如何實現較為精確的定時器
大部分人在遇到需要使用定時任務的時候首先會想到Timer類,
不過在JDK5.0之後就不建議使用這個專Timer了,因為它有很屬多的缺陷。
在新的java.util.concurrent包中的ScheledExecutorService可以替代這個Timer:
使用方法舉例:
Java代碼
ScheledThreadPoolExecutor exec = new ScheledThreadPoolExecutor(1);
exec.scheleAtFixedRate(new Runnable() {
public void run() {
try{
throw new RuntimeException();
}catch (Exception e){
System.out.println("RuntimeException catched");
}
}
}, 1000, 5000, TimeUnit.MILLISECONDS);
『玖』 JAVA服務集群與非集群的區別
集群肯定比非集群的處理能力強,但是你們集群不快可能是處理的瓶頸不在WEB到服務端的請求上,有可能是WEB端需要集群而不是服務端,更有可能是資料庫出現處理瓶頸而不是服務端。
要根據日誌分析和監控判斷好到底慢在哪裡。
一天才30000筆業務,對服務端程序來說簡直不值一提的