使用Liferay 6.1安排作业

时间:2018-08-21 05:54:22

标签: java liferay-6 job-scheduling

我引用了此链接link

安排我与liferay的工作。

我添加了Job Scheduler类:-

import com.liferay.portal.kernel.messaging.Message;
import com.liferay.portal.kernel.messaging.MessageListener;
import com.liferay.portal.kernel.messaging.MessageListenerException;

public class SchedulerLiferay implements MessageListener {

    @Override
    public void receive(Message arg0) throws MessageListenerException {
        System.out.println("hello world");

    }

}

在我的liferay portlet.xml文件中添加了:-

<portlet>
        <portlet-name>quartz-demo</portlet-name>
        <icon>/icon.png</icon>
        <scheduler-entry>
            <scheduler-event-listener-class>com.infinite.npsc.Job.SchedulerLiferay</scheduler-event-listener-class>
            <trigger>
                <!-- <simple>
                    <simple-trigger-value>
                        5
                    </simple-trigger-value>
                    <time-unit>second</time-unit>
                </simple> -->
                <cron>
                    <cron-trigger-value>0/5 * * * * ?</cron-trigger-value>
                </cron>
            </trigger>
        </scheduler-entry>
        <header-portlet-css>/css/main.css</header-portlet-css>
        <footer-portlet-javascript>/js/main.js</footer-portlet-javascript>
        <css-class-wrapper>quartz-demo-portlet</css-class-wrapper>
    </portlet>

,我也将此portlet添加到我的 portlet.xml 文件中,如下所示:-

<portlet>
        <portlet-name>quartz-demo</portlet-name>
        <display-name>Quartz Demo</display-name>
        <portlet-class>com.liferay.util.bridges.mvc.MVCPortlet</portlet-class>
        <init-param>
            <name>view-template</name>
            <value>/view.jsp</value>
        </init-param>
        <expiration-cache>0</expiration-cache>
        <supports>
            <mime-type>text/html</mime-type>
        </supports>
        <portlet-info>
            <title>Quartz Demo</title>
            <short-title>Quartz Demo</short-title>
            <keywords>Quartz Demo</keywords>
        </portlet-info>
        <security-role-ref>
            <role-name>administrator</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>guest</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>power-user</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>user</role-name>
        </security-role-ref>
    </portlet>

工作无法运行。应用程序成功启动,但没有任何反应。我希望每5秒钟在控制台中打印一次hello world

2 个答案:

答案 0 :(得分:0)

我已经根据您的问题创建了一个可运行的portlet,它在控制台(在Liferay EE 6.1.30上)中每5秒显示一次“ hello world”。

让我给您发送详细步骤:

  1. 我已使用Liferay Developer Studio 1.6.3为Liferay 6.1开发新的调度程序portlet
  2. 在Developer Studio中,我单击了File-> New-> Liferay Project
  3. 在“ Liferay门户运行时”环境中,我使用了从以下门户中提取的门户:liferay-portal-tomcat-6.1-ee-ga3-sp5-20160201142343123.zip
  4. 在我的项目中,我单击File-> New-> Liferay portlet并接受默认设置(注意:我将避免在portlet或类名中使用诸如'-'之类的字符)
  5. 然后我在项目中创建了一个新类'SchedulerLiferay',它看起来与您的类相同

import com.liferay.portal.kernel.messaging.Message;
import com.liferay.portal.kernel.messaging.MessageListener;
import com.liferay.portal.kernel.messaging.MessageListenerException;
public class SchedulerLiferay implements MessageListener {
    @Override
    public void receive(Message arg0) throws MessageListenerException {
    System.out.println("hello world");
    }
}

6。然后我像这样修改了liferay-portlet.xml:

<?xml version="1.0"?>
    <!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.1.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_6_1_0.dtd">

    <liferay-portlet-app>
        <portlet>
            <portlet-name>quartz-demo</portlet-name>
            <icon>/icon.png</icon>
            <scheduler-entry> 
                 <scheduler-event-listener-class>com.test.SchedulerLiferay</scheduler-event-listener-class> 
                 <trigger> 
                   <simple> 
                      <simple-trigger-value>5</simple-trigger-value>  
                      <time-unit>second</time-unit>   
                   </simple> 
                 </trigger> 
            </scheduler-entry>  
            <header-portlet-css>/css/main.css</header-portlet-css>
            <footer-portlet-javascript>/js/main.js</footer-portlet-javascript>
            <css-class-wrapper>quartz-demo-portlet</css-class-wrapper>
        </portlet>
        <portlet>
            <portlet-name>quartzdemo</portlet-name>
            <icon>/icon.png</icon>
            <instanceable>false</instanceable>
            <header-portlet-css>/css/main.css</header-portlet-css>
            <footer-portlet-javascript>
                /js/main.js
            </footer-portlet-javascript>
            <css-class-wrapper>quartzdemo-portlet</css-class-wrapper>
        </portlet>
        <role-mapper>
            <role-name>administrator</role-name>
            <role-link>Administrator</role-link>
        </role-mapper>
        <role-mapper>
            <role-name>guest</role-name>
            <role-link>Guest</role-link>
        </role-mapper>
        <role-mapper>
            <role-name>power-user</role-name>
            <role-link>Power User</role-link>
        </role-mapper>
        <role-mapper>
            <role-name>user</role-name>
            <role-link>User</role-link>
        </role-mapper>
    </liferay-portlet-app>

注意:我认为“简单触发器”和“ cron”不应同时使用。 这可能就是它无法在您身边起作用的原因。

  1. 我通过在portlet-class标记中定义我的类名来修改portlet.xml: com.test.QuartzDemo
  2. 如果您遇到此问题: “将QuartzDemo-portlet排队等待部署,因为它缺少portal-compat-hook” 解决方案在这里描述: https://community.liferay.com/forums/-/message_boards/message/27738413
  3. 我部署了Portlet 此时,您可能会遇到ecj.jar问题,可以通过以下方法解决:
    1. 转到窗口>首选项> Ant>运行时>类路径
    2. 添加外部jar(例如:E:\ liferayliferay-plugins-sdk-6.1.0-ce-ga1-20120106155615760 \ lib \ ecj.jar),即位于插件sdk文件夹下的ecj.jar。
    3. 现在重新运行构建脚本

确保使用兼容1.6的JVM。

在第6步中,我们需要特别注意,以正确的类名填写此标签: com.test.SchedulerLiferay

您可以在此处找到portlet的源代码: https://github.com/peterpetrekanics/QuartzDemo-portlet-6130

如果您有任何疑问,请随时在此处发布,
最好的问候,
彼得

答案 1 :(得分:0)

Liferay Cron Scheduler 有点敏感,不接受每一个值。

你可以用这个每分钟执行一次作业:

--#SET TERMINATOR @
CREATE PROCEDURE UPDATE_LEADERS_SCORE (
    IN in_School_ID  INTEGER, IN in_Leader_Score INTEGER) 
LANGUAGE SQL 
MODIFIES SQL DATA
  BEGIN
    UPDATE "CHICAGO_PUBLIC_SCHOOLS"
    SET "Leaders_Score" = in_Leader_Score
    WHERE "School_ID" = in_School_ID;
    IF in_Leader_Score >=  80 THEN 
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Very_Strong'
        WHERE "School_ID" = in_School_ID;
    ELSEIF in_Leader_Score>= 60 and in_Leader_Score <= 79  THEN
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Strong'
        WHERE "School_ID" = in_School_ID;
    ELSEIF in_Leader_Score >=  40 and in_Leader_Score <= 59  THEN
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Average'
        WHERE "School_ID" = in_School_ID;
    ELSEIF in_Leader_Score >=  20 and in_Leader_Score <= 39  THEN
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Weak'
        WHERE "School_ID" = in_School_ID;
    ELSE
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Very Weak'
        WHERE "School_ID" = in_School_ID;
        END IF;
  END 
  @

http://www.cronmaker.com/ 上,您的猫得到 Liferay 接受的表达式。