Ein Ansatz, den ich in meiner Arbeit verwenden ist wie unten:
erste konfiguriere ich in liferay-portlet.xml der Planer wie unten:
<?xml version="1.0"?>
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.2.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_6_2_0.dtd">
<liferay-portlet-app>
<portlet>
<portlet-name>your-portelt</portlet-name>
<icon>/icon.png</icon>
<scheduler-entry>
<scheduler-event-listener-class>your.class.that.implements.messagelistener</scheduler-event-listener-class>
<trigger>
<cron>
<cron-trigger-value>.... your cron</cron-trigger-value>
</cron>
</trigger>
</scheduler-entry>
...
</portlet>
...
</liferay-portlet-app>
dann die Logik meiner Busines I implementieren sheduler in einer Klasse, die ich im Scheduler-Event-Listener-Class-Tag referenziere.
public class YourManageScheduler implements MessageListener {
@Override
public void receive(Message message) throws MessageListenerException {
User user = ....
PermissionChecker permissionChecker = PermissionCheckerFactoryUtil.getPermissionCheckerFactory().create(user);
PermissionThreadLocal.setPermissionChecker(permissionChecker);
// your logic
...
// your logic
....
}
...
}
Eine wichtige Sache, wenn Sie einige api verwenden, die PermissionCheker Vorform haben Sie die permision cheker in Ihrem Thread konfigurieren lokalen oder versuchen api zu verwenden, die nicht über die Berechtigung cheker requred. Der entscheidende Punkt ist, dass in diesem Fall der Job asynchron gestartet wird und keine Benutzer protokolliert werden, da kein Berechtigungs-Cheker im MessageListener-Thread konfiguriert ist.
Ich hoffe, dass dies Ihnen helfen kann