我想在应用程序启动时从服务器下载某些文件。所以我尝试使用工作管理器,它从我的自定义应用程序类中排队。但是 Worker 类没有被触发,状态只是入队,不会进入运行状态.下面是我的代码:
应用类:
@Override
public void onCreate() {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
//.setRequiresStorageNotLow(true)
//.setRequiresBatteryNotLow(true)
.build();
OneTimeWorkRequest request = new OneTimeWorkRequest
.Builder(MyWorker.class)
//.setConstraints(constraints)
//.setInitialDelay(1,TimeUnit.SECONDS)
.addTag("download")
.build();
WorkManager.getInstance(getApplicationContext()).getWorkInfoByIdLiveData(request.getId()).observeForever(new Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
if (workInfo == null) {
Log.d("download", "workInfo == null");
} else {
Log.d("download", "workInfo != null: " + workInfo.getState().toString());//This is giving ENQUEUED once..thats it
}
}
});
WorkManager.getInstance(getApplicationContext()).enqueue(request);
}
Run Code Online (Sandbox Code Playgroud)
我的工人类
public class MyWorker extends Worker {
public MyWorker(@NonNull Context context, @NonNull …Run Code Online (Sandbox Code Playgroud) Weblogic 10.3.6管理控制台有两个与Stuck Threads时间配置相关的参数.
一个在:Servers -> Some_Server -> Configuration -> Tuning有参数:Stuck Thread Max Time
其他在:Servers -> Some_Server -> Configuration -> Overload有参数:Max Stuck Thread Time
在我做的一些测试中,只有Overload配置中的参数似乎触发了Failure Action相同的选项卡配置.我无法弄清楚Tuning选项卡中的参数是什么.在Oracle oficial文档中,两个参数具有相同的描述,但与不同的MBean相关:
[Stuck Thread Max Time] ServerMBean.StuckThreadMaxTime(http://docs.oracle.com/cd/E21764_01/apirefs.1111/e13952/pagehelp/Corecoreserverserverconfigtuningtitle.html)
[Max Stuck Thread Time] ServerFailureTriggerMBean.MaxStuckThreadTime(http://docs.oracle.com/cd/E21764_01/apirefs.1111/e13952/pagehelp/Corecoreserverserverconfigoverloadtitle.html)
我的问题是,这些参数之间有什么区别?
我已经实施了一个预定的工作经理。我的想法是每2小时完成一个过程。但我需要保证执行。根据工作管理器的文档,每个排队的进程都将被保证执行。
但是现在这个setRequiresDeviceIdle让我感到困惑。文档中指出,默认情况下setRequiresDeviceIdle已设置为false。所以我假设如果设备处于空闲模式,我的进程将无法工作。
和空闲模式=当手机屏幕关闭一段时间。
但是如果我将此setRequiresDeviceIdle设置为true。我假设现在它只会在设备处于空闲模式时工作。
即使设备处于空闲状态或未处于空闲状态,我也希望进程完成。我现在该怎么办?
我设法将CommonJ-JSR 237 Timer&WorkManager API(http://commonj.myfoo.de)的自定义实现配置为JNDIJetty 6和8上的资源,但它仅适用于全局范围.
有了这个解决方案JNDI资源的名称是wm/WorkManager,我需要它java:comp/env/wm/WorkManager,但由于限制,我不能用java:comp/env在全局JNDI名称,因为它保留到应用程序作用域的资源.
我创建了一个名为{jetty.home}/etc/jetty-wtm.xml并添加到的新配置文件{jetty.home}/start.ini.
以下是jetty-wtm.xmlJetty 6的内容,对于更大的版本,它有点不同,但也有效:
<!-- =============================================================== -->
<!-- Configure Server Time and Work Managers -->
<!-- =============================================================== -->
<Configure id="Server" class="org.mortbay.jetty.Server">
<New id="WorkManager" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>wm/WorkManager</Arg>
<Arg>
<New class="de.myfoo.commonj.work.FooWorkManager">
<Arg>
<New id="threadPool" class="de.myfoo.commonj.util.ThreadPool">
<Arg type="int">0</Arg>
<Arg type="int">10</Arg>
<Arg type="int">2</Arg>
</New>
</Arg>
</New>
</Arg>
</New>
<New id="TimeManager" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>tm/TimeManager</Arg>
<Arg>
<New class="de.myfoo.commonj.timers.FooTimerManager">
<Arg>
<New id="threadPool" class="de.myfoo.commonj.util.ThreadPool">
<Arg type="int">0</Arg>
<Arg …Run Code Online (Sandbox Code Playgroud) 我想使用 Flutter Workmanager,我在我的 .kt 中做了这样的引用配置:
package com.example.mybackprocess
import be.tramckrijte.workmanager.WorkmanagerPlugin
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugins.GeneratedPluginRegistrant
class App : FlutterApplication(), PluginRegistry.PluginRegistrantCallback {
override fun onCreate() {
super.onCreate()
WorkmanagerPlugin.setPluginRegistrantCallback(this)
}
override fun registerWith(reg: PluginRegistry?) {
GeneratedPluginRegistrant.registerWith(reg)
}
}
Run Code Online (Sandbox Code Playgroud)
我已经改变android:name以
android:name=".App"
Run Code Online (Sandbox Code Playgroud)
但它给了我这个错误:
在调试模式下在 G3212 上启动 lib\main.dart... e:E:\mybackprocess\android\app\src\main\kotlin\com\example\mybackprocess\MainActivity.kt: (15, 48): 类型不匹配:推断类型是 PluginRegistry?但 FlutterEngine 是预料之中的
FAILURE:构建失败,出现异常。* 出了什么问题:任务 ':app:compileDebugKotlin' 执行失败。编译错误。查看日志了解更多详情
尝试:使用 --stacktrace 选项运行以获取堆栈跟踪。使用 --info 或 --debug 选项运行以获得更多日志输出。使用 --scan 运行以获得完整的见解。* 在https://help.gradle.org获得更多帮助
BUILD FAILED in 55s Gradle task assembleDebug failed with exit code 1 …
为了统一Websphere 7和GlassFish 3环境中的部署,我决定尝试在GlassFish中实现CommonJ WorkManager和TimerManager.但它没有按预期工作.我做了以下事情:
使用在http://commonj.myfoo.de/上找到的myFOO CommonJ实现,并将库包含到我的domain/lib文件夹中(包括Spring库)
将以下内容添加到<resources>glassfish domain.xml 的部分:
<custom-resource res-type="commonj.work.WorkManager" jndi-name="wm/default" factory-class="de.myfoo.commonj.work.FooWorkManagerFactory"></custom-resource>
<custom-resource res-type="commonj.timers.TimerManager" jndi-name="tm/default" factory-class="de.myfoo.commonj.timers.FooTimerManagerFactory"></custom-resource>
Run Code Online (Sandbox Code Playgroud)
在domain.xml 的<servers>/ <server>section中包含引用:
<resource-ref ref="wm/default"></resource-ref>
<resource-ref ref="tm/default"></resource-ref>
Run Code Online (Sandbox Code Playgroud)
在我的测试应用程序的web.xml中添加适当的资源引用:
<resource-ref>
<description>WorkManager</description>
<res-ref-name>wm/default</res-ref-name>
<res-type>commonj.work.WorkManager</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<resource-ref>
<description>TimerManager</description>
<res-ref-name>tm/default</res-ref-name>
<res-type>commonj.timers.TimerManager</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
Run Code Online (Sandbox Code Playgroud)
将以下bean添加到我的applicationContext.xml:
<bean id="threadTestTaskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
<property name="workManagerName" value="wm/default" />
<property name="resourceRef" value="true"/>
</bean>
<bean id="threadTestTimerExecutor" class="org.springframework.scheduling.commonj.TimerManagerTaskScheduler">
<property name="timerManagerName" value="tm/default" />
<property name="resourceRef" value="true" />
<property name="shared" value="false" />
</bean>
<bean id="threadTest" class="test.ThreadTester"></bean>
<task:scheduled-tasks scheduler="threadTestTimerExecutor">
<task:scheduled …Run Code Online (Sandbox Code Playgroud) 我有一个要求,我必须在表中保留一些数据,持久可能需要一些时间.基本上我想坚持一个日志.我不希望执行等到持续完成.
我知道我必须使用线程来完成这项任务,我知道不鼓励在企业应用程序中创建线程.
所以我开始阅读有关工作管理器的知识,并在websphere应用服务器8.5中理解并尝试了一个示例程序.
我在websphere中使用了asynchbeans.jar,现在我很困扰我正在编写特定于供应商的代码.
然后我遇到了在Oracle java文档中描述的commonj work api.现在我想使用fabric3的commonj api.
我怀疑的是,有没有更好的方法来完成同样的任务?一种EJB方式?或者工作经理对我的要求有好处吗?
我有一个每 15 分钟运行一次的定期任务。
当混淆应用程序时。如果应用程序从后台被终止,工作管理器将不起作用。
测试设备:一加7T、诺基亚5+、Google Pixel 2模拟器
仅当应用程序位于前台或后台时,工作管理器才会执行。
禁用 proguard 工作管理器在所有 3 种情况下都有效
该应用程序位于前台
该应用程序在后台运行
该应用程序从后台被杀死
根据我在https://issuetracker.google.com/issues/160492142#上提出的问题
proguard 文件中可能存在问题。
#noinspection ShrinkerUnresolvedReference
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
# prevent Crashlytics obfuscation
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
-keep public class * extends java.lang.Exception
-keep class com.google.android.gms.measurement.AppMeasurement { *; }
###################################################################################################
# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
# EnclosingMethod is required to use InnerClasses.
-keepattributes Signature, InnerClasses, EnclosingMethod
# Retrofit does reflection …Run Code Online (Sandbox Code Playgroud) 根据我从文档https://developer.android.com/topic/libraries/architecture/workmanager中阅读的内容,
它说:
即使您的应用被强制退出或设备重新启动,该任务仍然可以保证运行。
那么这意味着,无论如何,在后台执行的任务都会100%执行到完成为止。
例如:
应用程序具有执行工作管理器实施的按钮,该按钮可将数据上传到在线数据库,但需要Internet连接才能上传数据。因此,我的应用程序当前处于离线模式,然后单击按钮。
我的不确定性:
工作管理器是否会在后台运行该过程,并在没有Internet连接的情况下继续重试该过程?并且仅完成并停止该过程,直到建立Internet连接并完成数据上传?
我是第一次与工作经理合作,我已经成功地实施了它。
我每 30 分钟定位一次以跟踪员工。
我在数据库第一次同步时启动了我的工作管理器,但我想在每天晚上停止它。
这是MyWorker.java
public class MyWorker extends Worker {
private static final String TAG = "MyWorker";
/**
* The desired interval for location updates. Inexact. Updates may be more or less frequent.
*/
private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 10000;
/**
* The fastest rate for active location updates. Updates will never be more frequent
* than this value.
*/
private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS =
UPDATE_INTERVAL_IN_MILLISECONDS / 2;
/**
* The current location.
*/ …Run Code Online (Sandbox Code Playgroud) android location alarmmanager workmanagers android-workmanager
在版本2.1.0中不推荐使用WorkManager.getInstance()
依赖关系:
implementation 'androidx.work:work-runtime:2.1.0'
Run Code Online (Sandbox Code Playgroud)
此方法或任何其他方式有什么变化?
workmanagers ×11
android ×6
commonj ×2
java ×2
alarmmanager ×1
androidx ×1
deprecated ×1
flutter ×1
glassfish ×1
java-ee ×1
java-ee-6 ×1
jetty ×1
jndi ×1
location ×1
proguard ×1
spring ×1
weblogic ×1
weblogic11g ×1
websphere-8 ×1