我想在我的Java桌面应用程序上生成警报:
我正在使用Java,Eclipse,SWT进行开发,并且使用Java Web Start从服务器部署了我的应用程序。我正在使用Mac OS X.6进行开发。
我认为我有几种选择:
如果将其作为系统服务运行,则可以从中受益,因为操作系统将确保我的软件:
我研究了一些可以使用的资源:
我对系统服务选项的疑问是:
我的计划实施是否正确:
因此,在第一次运行时,应用程序将安装该服务并启动它。当应用程序关闭时,该服务仍在运行,并且不再需要该应用程序,除非该应用程序未注册。
但是,我认为我仍然想念“启动时运行”功能。
我对吗?我想念什么吗?
在Unix上,我可以轻松地使用cron表,而无需应用程序将用户升级为root用户。我不需要处理重启,系统日期更改等问题。看起来不错。
在Windows上,即使在命令行中使用At或SchTasks,我也可以使用Task
Scheduler
。这看起来不错,但是我需要与XP兼容,直到7,而且我无法轻松对其进行测试。
那你会怎么做?我错过了什么?您有什么建议可以帮助我选择最佳,最优雅的解决方案吗?
这是我最终实现的:
public class AlarmManager {
public static final String ALARM_CLI_FORMAT = "startalarm:";
public static SupportedOS currentOS = SupportedOS.UNSUPPORTED_OS;
public enum SupportedOS {
UNSUPPORTED_OS,
MAC_OS,
WINDOWS,
}
public AlarmManager() {
final String osName = System.getProperty("os.name");
if (osName == null) {
L.e("Unable to retrieve OS!");
} else if ("Mac OS X".equals(osName)) {
currentOS = SupportedOS.MAC_OS;
} else if (osName.contains("Windows")) {
currentOS = SupportedOS.WINDOWS;
} else {
L.e("Unsupported OS: "+osName);
}
}
/**
* Windows only: name of the scheduled task
*/
private String getAlarmName(final long alarmId) {
return new StringBuilder("My_Alarm_").append(alarmId).toString();
}
/**
* Gets the command line to trigger an alarm
* @param alarmId
* @return
*/
private String getAlarmCommandLine(final long alarmId) {
return new StringBuilder("javaws -open ").append(ALARM_CLI_FORMAT).append(alarmId).append(" ").append(G.JNLP_URL).toString();
}
/**
* Adds an alarm to the system list of scheduled tasks
* @param when
*/
public void createAlarm(final Calendar when) {
// Create alarm
// ... stuff here
final long alarmId = 42;
// Schedule alarm
String[] commandLine;
Process child;
final String alarmCL = getAlarmCommandLine(alarmId);
try {
switch (currentOS) {
case MAC_OS:
final String cron = new SimpleDateFormat("mm HH d M '*' ").format(when.getTime()) + alarmCL;
commandLine = new String[] {
"/bin/sh", "-c",
"crontab -l | (cat; echo \"" + cron + "\") | crontab"
};
child = Runtime.getRuntime().exec(commandLine);
break;
case WINDOWS:
commandLine = new String[] {
"schtasks",
"/Create",
"/ST "+when.get(Calendar.HOUR_OF_DAY) + ":" + when.get(Calendar.MINUTE),
"/SC ONCE",
"/SD "+new SimpleDateFormat("dd/MM/yyyy").format(when.getTime()), // careful with locale here! dd/MM/yyyy or MM/dd/yyyy? I'm French! :)
"/TR \""+alarmCL+"\"",
"/TN \""+getAlarmName(alarmId)+"\"",
"/F",
};
L.d("create command: "+Util.join(commandLine, " "));
child = Runtime.getRuntime().exec(commandLine);
break;
}
} catch (final IOException e) {
L.e("Unable to schedule alarm #"+alarmId, e);
return;
}
L.i("Created alarm #"+alarmId);
}
/**
* Removes an alarm from the system list of scheduled tasks
* @param alarmId
*/
public void removeAlarm(final long alarmId) {
L.i("Removing alarm #"+alarmId);
String[] commandLine;
Process child;
try {
switch (currentOS) {
case MAC_OS:
commandLine = new String[] {
"/bin/sh", "-c",
"crontab -l | (grep -v \""+ALARM_CLI_FORMAT+"\") | crontab"
};
child = Runtime.getRuntime().exec(commandLine);
break;
case WINDOWS:
commandLine = new String[] {
"schtasks",
"/Delete",
"/TN \""+getAlarmName(alarmId)+"\"",
"/F",
};
child = Runtime.getRuntime().exec(commandLine);
break;
}
} catch (final IOException e) {
L.e("Unable to remove alarm #"+alarmId, e);
}
}
public void triggerAlarm(final long alarmId) {
// Do stuff
//...
L.i("Hi! I'm alarm #"+alarmId);
// Remove alarm
removeAlarm(alarmId);
}
}
用法很简单。使用以下命令安排新警报:
final AlarmManager m = new AlarmManager();
final Calendar cal = new GregorianCalendar();
cal.add(Calendar.MINUTE, 1);
m.createAlarm(cal);
触发这样的警报:
public static void main(final String[] args) {
if (args.length >= 2 && args[1] != null && args[1].contains(AlarmManager.ALARM_CLI_FORMAT)) {
try {
final long alarmId = Long.parseLong(args[1].replace(AlarmManager.ALARM_CLI_FORMAT, ""));
final AlarmManager m = new AlarmManager();
m.triggerAlarm(alarmId);
} catch (final NumberFormatException e) {
L.e("Unable to parse alarm !", e);
}
}
}
在Mac OS X.6和Windows
Vista上进行了测试。该类L
是我的助手,System.out.println
并G
保存我的全局常量(在这里,服务器上用于启动应用程序的JNLP文件)。
问题内容: 至少有六打Django应用程序为Django提供OpenID身份验证: django-openid django-openid-auth 另一个django-openid-auth,似乎已经死了 django-authopenid django-socialauth(还提供对Twitter和Facebook帐户的身份验证) django-socialregistration(也具有Fa
我在parallelism 5上有一份flink的工作(目前!!)。其中一个richFlatMap流在打开(配置参数)方法中打开一个文件。在flatMap操作中,没有任何打开操作,它只是读取文件来搜索某些内容。(有一个实用程序类,它的方法类似于utilityClass.searchText(“abc”))。以下是样板代码: python脚本每天都会在特定时间更新此文件。因此,我还应该在flatMa
问题内容: 请注意 :这是一个古老的问题,带有古老的答案。现在大多数链接的应用程序都不再需要维护。这些天来,大多数人似乎都使用django- allauth 或python-social- auth 。为了后代的缘故,下面将完整保留原始问题。 至少有六打Django应用程序为Django提供OpenID身份验证: django-openid django-openid-auth 另一个django
问题内容: 想象一下,我们必须依靠ajax请求来源。当所有回调都触发时,我想执行一些操作。除了这种方法外,如何做到这一点: 我在这里不喜欢的是,在这种情况下,我无法处理响应失败(例如,我无法设置响应超时)和整体方法(我想应该有一种方法可以使用更多功能)在这里编程) 有任何想法吗? 问候! UPD: 感谢您提供链式回调的解决方案。我在这里找到了一个很好的方法。这是评论中提出的内容: 稍作调整,即可等
我有以下代码: 我这样嘲笑: 在几行代码之后,会出现另一个链式方法调用: 我这样嘲笑: 所以我的问题是,我找不到比这更好的解决方案,因为问题是如果我告诉mockito将null返回给处理程序而不是iTspProcessorManagementHandler,那么我在(1)处得到一个nullpoer异常,但如果我对我的代码进行以下更改: 而不是mockito嘲笑每个方法调用,并且我的当-时返回语句不
尝试使用CompletionSuggester for autocomplete特性,通过Java的RestHighLevelClient实现CompletionSuggester有不同的方法,想知道以下这些方法之间(在性能/查询执行速度方面)有什么区别吗 1:使用CompletionSuggestionBuilder: 2:使用SimpleQueryString