In application server under console I define all the values in HHG-SQL1(Like Server, Database name, company and Startup parameter=JOBQUEUE2)
In Codeunit 1 I called CU50001. In 50001 under function I dfined second NAS configuration(Like server, Database, Company Name(From Job Queue Entry Card - "Company Name" field) and Startup Parameter=JOBQUEUE2|MASTER|JobqueueID.
Now When I am tryning to run First NAS from Application Srever, getting the error message CopySTR out of range.
What I am doing wrong here please advice. I am really confused.
Regards
Do you have more than 2 companies? If you have just two companies then you don't need this modification.
Add the following to CU 1
END;
//MOD01 Start
IF (COPYSTR(Parameter,1,9) = 'JOBQUEUE2') THEN BEGIN
CU50000.SetParameter(Parameter);
CU50000.RUN;
CGNASStartedinLoop := TRUE;
END;
//MOD01 End
IF CGNASStartedinLoop = FALSE THEN
You also do not need to install two NAS Service just one.
Ahmed Rashed Amini
Independent Consultant/Developer
Finally I can run 2 NAS for multiple companies. It was running fine since 2 days.No issues. Today one of my co-worker re-started NAS server and after that I am getting the isssue. The issue is CU5000 started the NAS and cmd command prompt, but it never be closed. cmd command prompt remian open unless I go manlly close the window and got the following message:
Windows cannot end this program.It may need more time to complete the operations.If you choose to end the program immediately you will loose unsaved data.
When close the window manully, NAS is not able to save any records in the table.( Called one code unit in JOBQueue which saves the records from the staging table to some other table). It won't do any process.
Windows cannot end this program.It may need more time to complete the operations.If you choose to end the program immediately you will loose unsaved data.
WSHExec.Terminate has been called in CU and when I message WSHExec.status, got the status=1 which means terminate but actully cmd prompt is not closed.
stop nas and make sure there are no nassql.exe running in the task manager. reboot the server.
The thing i would do is the start the job queue CU from nav client and monitor/ debug what is happening.
If you are in 2009 version you can use the job/queue webservice solution. If you are in 5.0 version you can do 2009 executalbes and use job/queue webservice solution
Ahmed Rashed Amini
Independent Consultant/Developer
I am using 2009 classic. As i read ur postings regarding webservices running for multiple companies, seems like client have to purchase one license for web services. I am not sure at this stage if they will buy the license. They already bought NAS license. So I am just wondering in NAV2009 if 2 NAS will run for multiple compnies without using webservices or not.
As i mentioned in my earlier post that it was running fine for couple of days and now i am getting the problem that cmd prompt did not close and hence nothing will happen. However if i look in Job queue log entry no error has been reported and status is Success instead of Errro.
As u said that I stopped the NAS and also did endtask from Task Manager and reboot the NAS server, but did not get any luck. Do I need to reboot SQL server also?
Please let me know if you can find what could be the issue.
Hello currently use your code: Job Queue for Unlimited Company but recurring errors that my client ask for them and I have not been able to explain what the origin of these.
Could you help me understand why there are these errors? are needed?
I Don’t understand this part: Why 10 milliseconds on idle time?
IF CURRENTDATETIME - StartDateTime > 10000 THEN BEGIN
Session2.SETRANGE("My Session",FALSE);
Session2.SETRANGE("User ID",Session."User ID");
Session2.SETRANGE("Database Name",Session."Database Name");
IF NOT GUIALLOWED THEN
Session2.SETRANGE("Application Name",Session."Application Name");
Session2.SETRANGE("Host Name",Session."Host Name");
IF NOT Session2.FINDFIRST THEN BEGIN
EXITNAS := TRUE;
Responseline := ' NAS JOB EXITED';
StandardError := TRUE;
WriteToArrayMsg(Responseline);
END ELSE
IF Session2."Idle Time" > 10 THEN BEGIN
EXITNAS := TRUE;
StandardError := TRUE;
Responseline := ' NAS JOB IDLE';
WriteToArrayMsg(Responseline);
END;
END;
The first NAS return a SUCCESS message that it's finished if you have changed that code, then nav will look at the Timeout. Make sure the Child NAS puts a SUCCESS message out to tell the Parent NAS that it's finished processing.
Ahmed Rashed Amini
Independent Consultant/Developer
I discovered a bug in this modification: when you set up a Job Queue Entry to run where Company Name <> '' and Recurring Job = FALSE, the Job fails with the error that it doesn't exist.
This is because the Job Queue Entry is deleted before it is actually run by the second NAS instance that is run from Codeunit Run NAS Accross Company.
I have one Company where Job Queue is set up: Company A. And I set up a Job Queue Entry to run a Codeunit in Company B with Recurring Job = FALSE.
The following happens:
The "normal" NAS instance that is running with StartUpParameter JOBQUEUE executes Function NASHandler in Codeunit 1. From there it runs Codeunit 448 Job Queue Dispacher. There the Automation NavTimer is enabled and from there it executes Function HandleRequest. There the following code is run:
IF ThisSessionIsActive THEN
MoreRequests := GetNextRequest(JobQueueEntry); // locks table
WHILE ThisSessionIsActive AND MoreRequests DO BEGIN
JobLogEntryNo := InsertLogEntry(JobQueueEntry);
ThisSessionIsActive := UpdateJobQueueSession(JobQueueEntry,TRUE);
COMMIT;
WasSuccess := CODEUNIT.RUN(CODEUNIT::"Job Queue Start Codeunit",JobQueueEntry);
In Function GetNextRequest the next Job Queue Entry to run is found. After it has been found the the following code is executed:
IF Found THEN BEGIN
JobQueueEntry.CALCFIELDS(XML);
IF JobQueueEntry."Recurring Job" THEN BEGIN
JobQueueEntry."Earliest Start Date/Time" := CalcNextRunTime(JobQueueEntry);
JobQueueEntry.Status := JobQueueEntry.Status::"In Process";
JobQueueEntry.MODIFY;
END ELSE
JobQueueEntry.DELETE;
END;
EXIT(Found);
The non-Recurring Job has now been deleted but has not been committed to the database yet. But before the Job Queue Start Codeunit that actually runs the job is called a COMMIT statement is executed. Normally this is no problem because the Job Queue Entry Record still exists in memory but because this modification that runs NAS accross Companies starts a second NAS instance with StartUpParameter JOBQUEUE2 that has to run this job, it is a problem. The delete of the Non-Recurring Job Queue Entry Record is already committed and the Job fails because the second NAS instance can't find it anymore.
I applied the following two fixes to solve this problem:
Codeunit 448 Job Queue Dispatcher, Function GetNextRequest:
IF Found THEN BEGIN
JobQueueEntry.CALCFIELDS(XML);
IF JobQueueEntry."Recurring Job" THEN BEGIN
JobQueueEntry."Earliest Start Date/Time" := CalcNextRunTime(JobQueueEntry);
JobQueueEntry.Status := JobQueueEntry.Status::"In Process";
JobQueueEntry.MODIFY;
END ELSE
//Begin
//JobQueueEntry.DELETE;
IF JobQueueEntry."Company Name" = '' THEN
JobQueueEntry.DELETE;
//End
END;
EXIT(Found);
Codeunit 449 Job Queue Start Codeunit, Function OnRun:
//MOD01 START
IF "Company Name" <> '' THEN BEGIN
CLEAR(CduRunNASAccrossCompany);
CduRunNASAccrossCompany.RunNasForOtherCompany(Rec);
//Begin
IF NOT "Recurring Job" THEN
DELETE;
//End
END ELSE
//MOD01 END
Comments
You shouldn't use it to start NAS.
Independent Consultant/Developer
blog: https://dynamicsuser.net/nav/b/ara3n
I have 2 NAS - HHG-SQL1 and HHG-SQL2.
In application server under console I define all the values in HHG-SQL1(Like Server, Database name, company and Startup parameter=JOBQUEUE2)
In Codeunit 1 I called CU50001. In 50001 under function I dfined second NAS configuration(Like server, Database, Company Name(From Job Queue Entry Card - "Company Name" field) and Startup Parameter=JOBQUEUE2|MASTER|JobqueueID.
Now When I am tryning to run First NAS from Application Srever, getting the error message CopySTR out of range.
What I am doing wrong here please advice. I am really confused.
Regards
Do you have more than 2 companies? If you have just two companies then you don't need this modification.
Add the following to CU 1
END;
//MOD01 Start
IF (COPYSTR(Parameter,1,9) = 'JOBQUEUE2') THEN BEGIN
CU50000.SetParameter(Parameter);
CU50000.RUN;
CGNASStartedinLoop := TRUE;
END;
//MOD01 End
IF CGNASStartedinLoop = FALSE THEN
You also do not need to install two NAS Service just one.
Independent Consultant/Developer
blog: https://dynamicsuser.net/nav/b/ara3n
Event Type: Warning
Event Source: GGHAPP01-SQL-2
Event Category: None
Event ID: 20010
Date: 8/27/2010
Time: 2:22:24 PM
User: N/A
Computer: GGHAPP01
Description:
The value of COPYSTR parameter 3 is outside of the permitted range.
The current value is: -1.
The permitted range is: from 0 to 2147483647.
For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Independent Consultant/Developer
blog: https://dynamicsuser.net/nav/b/ara3n
Finally I can run 2 NAS for multiple companies. It was running fine since 2 days.No issues. Today one of my co-worker re-started NAS server and after that I am getting the isssue. The issue is CU5000 started the NAS and cmd command prompt, but it never be closed. cmd command prompt remian open unless I go manlly close the window and got the following message:
Windows cannot end this program.It may need more time to complete the operations.If you choose to end the program immediately you will loose unsaved data.
When close the window manully, NAS is not able to save any records in the table.( Called one code unit in JOBQueue which saves the records from the staging table to some other table). It won't do any process.
Windows cannot end this program.It may need more time to complete the operations.If you choose to end the program immediately you will loose unsaved data.
WSHExec.Terminate has been called in CU and when I message WSHExec.status, got the status=1 which means terminate but actully cmd prompt is not closed.
Please let me know if you have any idea.
Regards
Mini
The thing i would do is the start the job queue CU from nav client and monitor/ debug what is happening.
If you are in 2009 version you can use the job/queue webservice solution. If you are in 5.0 version you can do 2009 executalbes and use job/queue webservice solution
Independent Consultant/Developer
blog: https://dynamicsuser.net/nav/b/ara3n
I am using 2009 classic. As i read ur postings regarding webservices running for multiple companies, seems like client have to purchase one license for web services. I am not sure at this stage if they will buy the license. They already bought NAS license. So I am just wondering in NAV2009 if 2 NAS will run for multiple compnies without using webservices or not.
As i mentioned in my earlier post that it was running fine for couple of days and now i am getting the problem that cmd prompt did not close and hence nothing will happen. However if i look in Job queue log entry no error has been reported and status is Success instead of Errro.
As u said that I stopped the NAS and also did endtask from Task Manager and reboot the NAS server, but did not get any luck. Do I need to reboot SQL server also?
Please let me know if you can find what could be the issue.
Regards
Mini
Any thought in my previous mail?
Regards
Mini
Could you help me understand why there are these errors? are needed?
I Don’t understand this part: Why 10 milliseconds on idle time?
IF CURRENTDATETIME - StartDateTime > 10000 THEN BEGIN
Session2.SETRANGE("My Session",FALSE);
Session2.SETRANGE("User ID",Session."User ID");
Session2.SETRANGE("Database Name",Session."Database Name");
IF NOT GUIALLOWED THEN
Session2.SETRANGE("Application Name",Session."Application Name");
Session2.SETRANGE("Host Name",Session."Host Name");
IF NOT Session2.FINDFIRST THEN BEGIN
EXITNAS := TRUE;
Responseline := ' NAS JOB EXITED';
StandardError := TRUE;
WriteToArrayMsg(Responseline);
END ELSE
IF Session2."Idle Time" > 10 THEN BEGIN
EXITNAS := TRUE;
StandardError := TRUE;
Responseline := ' NAS JOB IDLE';
WriteToArrayMsg(Responseline);
END;
END;
Independent Consultant/Developer
blog: https://dynamicsuser.net/nav/b/ara3n
This is because the Job Queue Entry is deleted before it is actually run by the second NAS instance that is run from Codeunit Run NAS Accross Company.
I have one Company where Job Queue is set up: Company A. And I set up a Job Queue Entry to run a Codeunit in Company B with Recurring Job = FALSE.
The following happens:
The "normal" NAS instance that is running with StartUpParameter JOBQUEUE executes Function NASHandler in Codeunit 1. From there it runs Codeunit 448 Job Queue Dispacher. There the Automation NavTimer is enabled and from there it executes Function HandleRequest. There the following code is run:
IF ThisSessionIsActive THEN
MoreRequests := GetNextRequest(JobQueueEntry); // locks table
WHILE ThisSessionIsActive AND MoreRequests DO BEGIN
JobLogEntryNo := InsertLogEntry(JobQueueEntry);
ThisSessionIsActive := UpdateJobQueueSession(JobQueueEntry,TRUE);
COMMIT;
WasSuccess := CODEUNIT.RUN(CODEUNIT::"Job Queue Start Codeunit",JobQueueEntry);
In Function GetNextRequest the next Job Queue Entry to run is found. After it has been found the the following code is executed:
IF Found THEN BEGIN
JobQueueEntry.CALCFIELDS(XML);
IF JobQueueEntry."Recurring Job" THEN BEGIN
JobQueueEntry."Earliest Start Date/Time" := CalcNextRunTime(JobQueueEntry);
JobQueueEntry.Status := JobQueueEntry.Status::"In Process";
JobQueueEntry.MODIFY;
END ELSE
JobQueueEntry.DELETE;
END;
EXIT(Found);
The non-Recurring Job has now been deleted but has not been committed to the database yet. But before the Job Queue Start Codeunit that actually runs the job is called a COMMIT statement is executed. Normally this is no problem because the Job Queue Entry Record still exists in memory but because this modification that runs NAS accross Companies starts a second NAS instance with StartUpParameter JOBQUEUE2 that has to run this job, it is a problem. The delete of the Non-Recurring Job Queue Entry Record is already committed and the Job fails because the second NAS instance can't find it anymore.
I applied the following two fixes to solve this problem:
Codeunit 448 Job Queue Dispatcher, Function GetNextRequest:
IF Found THEN BEGIN
JobQueueEntry.CALCFIELDS(XML);
IF JobQueueEntry."Recurring Job" THEN BEGIN
JobQueueEntry."Earliest Start Date/Time" := CalcNextRunTime(JobQueueEntry);
JobQueueEntry.Status := JobQueueEntry.Status::"In Process";
JobQueueEntry.MODIFY;
END ELSE
//Begin
//JobQueueEntry.DELETE;
IF JobQueueEntry."Company Name" = '' THEN
JobQueueEntry.DELETE;
//End
END;
EXIT(Found);
Codeunit 449 Job Queue Start Codeunit, Function OnRun:
//MOD01 START
IF "Company Name" <> '' THEN BEGIN
CLEAR(CduRunNASAccrossCompany);
CduRunNASAccrossCompany.RunNasForOtherCompany(Rec);
//Begin
IF NOT "Recurring Job" THEN
DELETE;
//End
END ELSE
//MOD01 END
Hope this helps somebody
Regards, Max